MergeSortHelper.SAMPLE_DIR = MergeSortHelper.SAMPLE_DIR + "multi_thread";
MergeSortHelper.output("Multi threads sort begin ...");
MergeSortHelper.output("Generating random big queue ...");
IBigQueue srcBigQueue = new BigQueueImpl(MergeSortHelper.SAMPLE_DIR, "srcq");
Populator[] populators = new Populator[threadNum];
for(int i = 0; i < threadNum; i++) {
populators[i] = new Populator(srcBigQueue, maxNumOfItems, itemSize);
populators[i].start();
}
for(int i = 0; i < threadNum; i++) {
try {
populators[i].join();
} catch (InterruptedException e) {
// ignore
}
}
long start = System.currentTimeMillis();
MergeSortHelper.output("Making queue of sorted queues ...");
Queue<IBigQueue> queueOfSortedQueues = new LinkedBlockingQueue<IBigQueue>();
SortedQueueMaker[] sortedQueueMakers = new SortedQueueMaker[threadNum];
for(int i = 0; i < threadNum; i++) {
sortedQueueMakers[i] = new SortedQueueMaker(srcBigQueue, maxInMemSortNumOfItems, queueOfSortedQueues);
sortedQueueMakers[i].start();
}
for(int i = 0; i < threadNum; i++) {
try {
sortedQueueMakers[i].join();
} catch (InterruptedException e) {
// ignore
}
}
srcBigQueue.removeAll();
srcBigQueue.close();
MergeSortHelper.output("Merging and sorting the queues ...");
MergeSorter[] mergeSorters = new MergeSorter[threadNum];
for(int i = 0; i < threadNum; i++) {
mergeSorters[i] = new MergeSorter(queueOfSortedQueues, maxMergeSortWays);
mergeSorters[i].start();
}
for(int i = 0; i < threadNum; i++) {
try {
mergeSorters[i].join();
} catch (InterruptedException e) {
// ignore
}
}
long end = System.currentTimeMillis();
MergeSortHelper.output("Mergesort finished.");
MergeSortHelper.output("Time used to sort " + maxNumOfItems + " string items is " + (end - start) + "ms");
MergeSortHelper.output("Item size each is " + itemSize + " bytes");
MergeSortHelper.output("Total size sorted " + (long)(maxNumOfItems * itemSize) / (1024 * 1024) + "MB");
MergeSortHelper.output("Thread num " + threadNum);
IBigQueue targetSortedQueue = queueOfSortedQueues.poll(); // last and only one is the target sorted queue
MergeSortHelper.output("Validation begin ....");
long targetSize = targetSortedQueue.size();
if(targetSize != maxNumOfItems) {
System.err.println("target queue size is not correct!, target queue size is " + targetSize + " expected queue size is " + maxNumOfItems);
}
// first sorted item
String previousItem = new String(targetSortedQueue.dequeue());
// validate the sorted queue
for(int i = 1; i < targetSize; i++) {
String item = new String(targetSortedQueue.dequeue());
if (item.compareTo(previousItem) < 0) {
System.err.println("target queue is not in sorted order!");
}
previousItem = item;
}
MergeSortHelper.output("Validation finished.");
// have done with target sorted queue, empty it and delete back data files to save disk space
targetSortedQueue.removeAll();
targetSortedQueue.close();
}