ホームページ >Java >&#&チュートリアル >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 サイトの他の関連記事を参照してください。