我想使用线程对文件进行排序。这里是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]);
}
什么是您的计时数据?它有多快?或者用“噪音艺术”的话来说:“速度有多快?”您似乎正在整理文件内容。文件系统访问可能是瓶颈。创建线程是一个沉重的过程,但它可能没有任何好处。 –
如果您需要执行操作并在最后结合结果,ForkJoinPool可能是更好的选择。 – xTrollxDudex
@RogerGustavsson Sort.sort花费1.129517647秒读取和排序数据。 Sort.threadedSort花费3.171421661秒来读取和排序数据。 – ms8