Я использую многопоточную функцию быстрой сортировки Java из библиотеки cern.colt.ParallelQuickSort (http://incanter.org/docs/parallelcolt/api/cern/colt/ParallelQuickSort.html и https://github.com/Danimoth/Parallel-Colt/blob/master/src/cern/colt/ParallelQuickSort.java). Я хочу проверить, сколько времени уходит при выборе различного количества потоков. Я использую System.nanoTime(), чтобы отслеживать время выполнения. Однако, даже когда количество потоков, которые я выбираю, и несортированный массив одинаковы для нескольких прогонов, время выполнения совершенно иное. Я думаю, это связано с тем, что quicksort(), предоставленная в библиотеке cern.colt.ParallelQuickSort, не ждет завершения потоков. Я хотел бы знать, как я могу написать код, чтобы ждать завершения всех потоков, чтобы я мог измерять время выполнения вне функции, предоставленной библиотекой? Что-то вроде ниже :?wait for all threads complete in Java
ParallelQuickSort qs=new ParallelQuickSort();
long startTime = System.nanoTime();
qs.quickSort(unsorted_array, 0, array_size, comp, number_threads);
//java code to wait for all threads to complete
long time_elapse= System.nanoTime() - startTime;
Edit: Ниже мой код: Первоначально мой код для запуска быстрой сортировки с числом нитей от 1 до 15 для размера массива 2^10, 2^15, 2^20, 2^25 и 2^28, и для каждого случая я запускаю 30 раз. Чтобы отлаживать, я изменил свой код, чтобы выполнить только размер массива = 2^10 с использованием 1 потока и запустить его в 10 раз.
import cern.colt.ParallelQuickSort;
import cern.colt.function.tint.IntComparator;
import cern.colt.Timer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.System.*;
import java.util.*;
public class quick_sort {
static void readData(int dst[], int nitems, int num) throws IOException{
String s="mydata"+Integer.toString(num)+".txt";
//System.out.println(s);
Scanner scanner = new Scanner(new File(s));
int i = 0;
while(scanner.hasNextInt())
{
dst[i++] = scanner.nextInt();
}
}
public static void main(String [ ] args) throws IOException
{
//for(int i=0; i<n;i++) dst[i]=n-i;
/*
System.out.println("Unsorted: ");
for(int i=0; i<n; i++) System.out.print(dst[i]+" ");
System.out.println(" ");
*/
IntComparator comp=new IntComparator(){
public int compare(int a, int b){
if(a>b) return 1;
else if(a<b) return -1;
else return 0;
}
};
int iter=10;
int thread_num=1;
//FileWriter fw = new FileWriter("out.txt");
int num[]={10, 15, 20, 25, 28};
for(int m=0; m<1; m++){
for(int k=1; k<=thread_num; k++){
long estimatedTime=0;
for(int i=0; i<iter; i++){
int n=1<<num[m];
int dst[]=new int[n];
readData(dst, n, num[m]);
ParallelQuickSort qs=new ParallelQuickSort();
long startTime = System.nanoTime();
qs.quickSort(dst, 0, n, comp, k);
long temp= System.nanoTime() - startTime;
estimatedTime+=temp;
System.out.println("Time="+temp*0.000001);
}
System.out.println(num[m]+"Wall Clock Time when thread number="+k+": "+estimatedTime/iter*0.000001);
//fw.write(num[m]+"Wall Clock Time when thread number="+k+": "+estimatedTime/iter*0.000001+'\n');
}
//System.out.println("Sorted: ");
//for(int i=0; i<n; i++) System.out.print(dst[i]+" ");
//System.out.println(" ");
}
//fw.close();
System.out.println("Finish!");
}
}
Результат показан ниже:
Time=0.755289
Time=0.632124
Time=0.502016
Time=0.502922
Time=0.100524
Time=0.076072
Time=0.073657
Time=0.073355
Time=0.074261
Time=0.076374
10Wall Clock Time when thread number=1: 0.286659
Finish!
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join%28%29 - Надеюсь, это полезно. – BatScream
У меня нет способа получить потоки, созданные в этой функции, как я могу использовать join? – weidan
Используйте CountDownLatch. –