我正在尝试使用线程对文件进行排序。这是 Sort.java :
这个函数在线程的帮助下排序
public static String[] threadedSort(File[] files) throws IOException {
String sortedData[] = new String[0];
int counter = 0;
boolean allThreadsTerminated = false;
SortingThread[] threadList = new SortingThread[files.length];
for (File file : files) {
String[] data = getData(file);
threadList[counter] = new SortingThread(data);
threadList[counter].start();
counter++;
}
while(!allThreadsTerminated) {
allThreadsTerminated = true;
for(counter=0; counter<files.length; counter++) {
if(threadList[counter].getState() != Thread.State.TERMINATED) {
allThreadsTerminated = false;
}
}
}
for(counter=0; counter<files.length; counter++) {
sortedData = MergeSort.merge(sortedData, threadList[counter].data);
}
return sortedData;
}
此功能正常排序
public static String[] sort(File[] files) throws IOException {
String[] sortedData = new String[0];
for (File file : files) {
String[] data = getData(file);
data = MergeSort.mergeSort(data);
sortedData = MergeSort.merge(sortedData, data);
}
return sortedData;
}
现在,当我使用两种方式进行排序时,正常排序比线程版本更快。这可能是什么原因?我错过了什么吗?
我的 SortingThread 是这样的:
public class SortingThread extends Thread {
String[] data;
SortingThread(String[] data) {
this.data = data;
}
public void run() {
data = MergeSort.mergeSort(data);
}
}
当我通过将其性能与原始非线程实现进行比较来分析我的线程实现时,我发现第二个更快。这种行为的原因是什么?如果我们谈论相对性能改进,我们期望线程实现更快,如果没有错的话。
编辑:假设我有正常功能的 MergeSort。但是在这里发布它的代码是没有用的。getData() 函数也只是从文件中获取输入。我认为问题在于将整个文件放入数组中。我认为我应该为不同的线程提供不同的行:
private static String[] getData(File file) throws IOException {
ArrayList<String> data = new ArrayList<String>();
BufferedReader in = new BufferedReader(new FileReader(file));
while (true) {
String line = in.readLine();
if (line == null) {
break;
}
else {
data.add(line);
}
}
in.close();
return data.toArray(new String[0]);
}