gpt4 book ai didi

java - 在Java中等待所有线程完成

转载 作者:行者123 更新时间:2023-12-01 11:54:24 26 4
gpt4 key购买 nike

我使用 cern.colt.ParallelQuickSort 库中的多线程快速排序 Java 函数( http://incanter.org/docs/parallelcolt/api/cern/colt/ParallelQuickSort.htmlhttps://github.com/Danimoth/Parallel-Colt/blob/master/src/cern/colt/ParallelQuickSort.java )。我想测试选择不同数量的线程时花费了多少时间。我使用 System.nanoTime() 来跟踪运行时间。然而,即使我选择的线程数和未排序的数组对于多次运行相同,运行时间也有很大不同。我认为这是因为 cern.colt.ParallelQuickSort 库中提供的 fastsort() 无需等待线程完成。我想知道如何编写代码来等待所有线程完成,以便我可以测量库提供的函数之外的运行时间?如下所示:?

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;

编辑:下面是我的代码:最初,我的代码是使用线程数从 1 到 15 运行快速排序,数组大小为 2^10、2^15、2^20、2^25 和 2^28,每种情况我运行 30 次。为了调试,我将代码更改为仅使用 1 个线程运行 array size=2^10 并运行 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!

最佳答案

函数ParallelQuickSort.quicksort仅在所有线程/子操作完成后才返回。您无需手动等待所有线程完成。

这可以通过查看代码(查找 other.get())来确认,并且这是唯一合理的行为。

编辑:测试性能可能非常困难,请参阅 Java Performance Testing以及许多其他地方的详细信息。

关于java - 在Java中等待所有线程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28552124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com