ホームページ >Java >&#&チュートリアル >ExecutorService を続行する前にすべてのタスクが完了していることを確認するにはどうすればよいですか?

ExecutorService を続行する前にすべてのタスクが完了していることを確認するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-28 08:14:13815ブラウズ

How Can I Ensure All Tasks Complete Before Proceeding with an ExecutorService?

ExecutorService - タスクの完了を待機するためのソリューション

同時に実行する必要がある多数の計算タスクを扱う場合、すべてのタスクが完了するまで待機するメカニズムを用意することが重要です。これにより、すべてのタスクが完了した後にのみ後続のアクションを実行できるようになります。

この例では、ExecutorService.wait() を使用してこれを実現しようとしていますが、IllegalMonitorStateException が発生しています。このエラーは、wait() がオブジェクトの固有ロックを待機するときに使用されるように意図されているために発生しますが、このシナリオには適用されません。

最も簡単な解決策は、ExecutorService.invokeAll() を利用することです。このメソッドは、Callable タスクのコレクションを取得し、それらを並列実行して、Future オブジェクトのリストを返します。それぞれの Future は、特定のタスクの結果を表します。デフォルトでは、invokeAll() はすべてのタスクが完了するまでブロックしてから、Future オブジェクトのリストを返します。

コードを変更する方法は次のとおりです。

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> tasks = new ArrayList<>();

for (DataTable singleTable : uniquePhrases) {
    tasks.add(Executors.callable(new ComputeDTask(singleTable)));
}

List<Future<Object>> results = es.invokeAll(tasks);

この更新されたコードでは、ExecutorService .invokeAll() はすべてのタスクが完了するまで待機するため、自信を持って後続のアクションを続行できます。

以上がExecutorService を続行する前にすべてのタスクが完了していることを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。