1

Executor service在我的一个中使用Multithreaded code。我正在尝试查看我的所有线程是否都完成了他们的工作,然后我需要执行某些任务。

目前我需要测量经过的时间,所以我只能在所有线程完成执行那里的作业后才能测量经过的时间。所以我目前有这个代码?我正在测量time elapsedfinally 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;
}
4

2 回答 2

1

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

在服务终止或几秒钟过去之前,之前的awaitTermination调用不会返回。(2^63 - 1)(那是一个长的时间。)


更新- 更新版本对我来说看起来不错。

于 2013-02-12T03:27:25.050 回答
1

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

这工作得很好。这也应该解决您的问题陈述。

于 2013-02-12T03:19:33.430 回答