1

私はExecutor service私のの1つで使用してい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;
}
4

2 に答える 2

1

Q:必要whileですか?A:いいえ。

前の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 に答える