ExecutorService タスクの終了を待機しています
質問:
ExecutorService タスクの終了を効率的に待つにはどうすればよいですか? ExecutorService に送信されたすべてのタスクを完了するには?特定の使用例には、複数のコアで実行される計算タスクが含まれます。
Background:
指定されたコード スニペットは ExecutorService.wait() を利用しますが、IllegalMonitorStateException で失敗します。タスクの実行は成功しましたが、待機操作で問題が発生したようです。
回答:
ExecutorService.invokeAll()
推奨される解決策は ExecutorService.invokeAll() を使用することです。これは、すべてのタスクが完了するのを待つための簡単な方法を提供します。変更されたコード例は次のとおりです。
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> todo = new ArrayList<>(singleTable.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() 動作
invokeAll() は、すべてのタスクが完了するまでブロックされます。結果の回答コレクションには、各タスクのステータスと潜在的な戻り値を表す Future が含まれます。デフォルトでは、Executors.callable() でラップされたこれらの Future は null を返します。ただし、ComputeDTask を変更して Callable
利点:
invokeAll() を使用すると、コードが簡素化され、wait() に関連する潜在的な競合状態が回避されます。また、ExecutorService を複数のサイクルで再利用できるようになります。
関連質問:
さらに詳しく説明するには、Stack Overflow に関する次の関連質問を検討してください。
以上がすべての ExecutorService タスクが完了するのを効率的に待つ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。