Я пытаюсь отсортировать файл с помощью потоков. Вот 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]);
}