ExecutorService: タスクの完了を待つ
ExecutorService は効率的にタスクを実行するための便利なツールですが、すべてのタスクが完了するまで一時停止するのは難しい場合があります。一般的な問題とその実際的な解決策について詳しく見てみましょう。
wait() のエラー
固定スレッド プール ExecutorService を使用する引用コード スニペットでは、次のような問題が発生します。 es.wait() を使用しようとすると IllegalMonitorStateException が発生します。これは、wait() が ExecutorService ではなく、特定のスレッド同期イディオムでの使用を目的としているために発生します。
最も簡単な解決策: invokeAll()
ExecutorService は、より簡単な代替手段を提供します。この目的: invokeAll()。このメソッドは、呼び出し可能なタスクのコレクションを取得し、それらを並行して実行し、すべてのタスクが終了するまでブロックします。使用方法は次のとおりです。
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> todo = new ArrayList<>(uniquePhrases.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() は、それぞれが個別のタスクを表す Future オブジェクトのリストを返します。すべてのタスクが完了すると、Future の isDone() にアクセスすると true が返されます。
invokeAll() の利点
その他のメソッド
invokeAll() では、タスクが Callable を実装する必要があることに注意してください。 ComputeDTask が Runnable の場合は、コード スニペットに示されているようにラップするか、Executors.callable() を利用します。
以上がExecutorService ですべてのタスクが完了するのを効率的に待つにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。