ExecutorService を利用する場合、開発者は、割り当てられたすべてのタスクが完了するまで実行を一時停止する必要が生じる場合があります。この調査では、この目的を達成するための最も簡単なアプローチを検討します。
質問:
コアごとに 1 つずつ、多数の計算タスクを実行し、完了するまで実行を一時停止します。現在の実装では ExecutorService.execute() と es.wait() を利用していますが、IllegalMonitorStateException が発生します。
答え:
ExecutorService.invokeAll() を使用する簡単な解決策です。必要な機能を 1 行で実現します。 code:
List<Callable<Object>> todo = new ArrayList<Callable<Object>>(singleTable.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() は、すべてのタスクが完了するまで実行を一時停止し、手動シャットダウンと awaitTermination() を不要にします。このアプローチは、複数の実行にわたって再利用可能な ExecutorService インスタンスと連携します。
関連トピックの詳細については、次のリファレンスを参照してください:
以上がExecutorService を使用してタスクの完了を効率的に待つ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。