等待所有线程完成其工作,然后测量经过的时间

时间:2013-02-12 03:15:39

标签: java multithreading executorservice

我在Executor service之一中使用Multithreaded code。我试图看看我的所有线程是否完成了他们的工作然后我需要完成某项任务。

目前我需要测量经过的时间,所以我只能测量所有线程完成执行作业后经过的时间。所以我目前有这个代码?我正在衡量time elapsed中的finally block

ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

long startTime = System.nanoTime();
try {
    for (int i = 0; i<noOfThreads; i++) {
        service.submit(new Task());
    }
    service.shutdown();
    service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

    //Do I need this while block here?
    while (!service.isTerminated()) {

    }
} catch (InterruptedException e) {
    //Log exception here
} finally {
    long estimatedTime = System.nanoTime() - startTime;
    logTimingInfo(estimatedTime, noOfTasks, noOfThreads);
}

我不确定我是否需要while loop?我目前的做法是否合适?

更新代码: -

所以下面的代码应该可以正常工作。正确?

ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

long startTime = System.nanoTime();
try {
    for (int i = 0; i<noOfThreads; i++) {
        service.submit(new Task());
    }
    service.shutdown();
    service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);     
} catch (InterruptedException e) {
    //Log exception here
} finally {
    long estimatedTime = System.nanoTime() - startTime;
}

2 个答案:

答案 0 :(得分:1)

您不需要重新发明轮子。您可以使用http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CompletionService.html

这很好用。这也应该解决你的问题陈述。

答案 1 :(得分:1)

问:你需要while吗?答:没有。

在服务终止或awaitTermination秒已过去之前,先前的(2^63 - 1)调用不会返回。 (这是非常长时间。)


更新 - 更新后的版本对我来说很合适。