I am trying to sort a file using threading. Here is Sort.java :
This function sorts with help of threading
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; } This function sorts just normally
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; } Now when I sort using both ways the normal sorting is faster than threaded version. What can be reason for it ? Had i missed something ?
My SortingThread is something like this :
public class SortingThread extends Thread { String[] data; SortingThread(String[] data) { this.data = data; } public void run() { data = MergeSort.mergeSort(data); } } When I analyze my threaded implementation by comparing its performance to the original non-threaded implementation I find second one faster. What can be reason for such behavior ? If we talk of relative performance improvement we expect for threaded implementation to be faster if am not wrong.
EDIT : Assume I have properly functional MergeSort. But its of no use to post its code here. Also getData() function is just to take input from file. I think problem lies with the fact that am taking whole file in array. I think I should provide different lines to different threads :
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]); }