タスクのパイプラインがあり (パイプライン内の各タスクには異なる並列処理要件があります)、各タスクは異なる ExecutorService で動作します。タスクはデータのパケットで動作するため、10 個のデータ パケットがある場合、10 個のタスクが に送信されservice1
、データ パケットごとに 1 つのタスクが送信されます。にサブミットされたタスクservice1
が実際に呼び出されると、新しいタスクをサブミットしてデータパケットをさらに処理することがservice2
できservice3
ます。
次のコードは正常に動作します。
shutdown()
service1
すべてが送信された後に呼び出されますservice1
その後、shutdown() の前に送信されたすべてのタスクが実際に実行を完了するまで、awaitTermination() は返されません。--その後、 onが
shutdown()
呼び出されますが、送信されたすべてのタスクが完了し、すべてのタスクが送信されているためです。-- などservice2
service1
service2
service1
service2
shutdown()
service2
service3
ExecutorService[] services = { service1, service2, service3}; int count = 0; for(ExecutorService service: services) { service.shutdown(); service.awaitTermination(1, TimeUnit.HOURS); }
ただしservice2
、データパケットを小さなパケットに分割して追加のタスクを送信できるケースを追加したservice2
ところ、コードが失敗しています。問題は、すべてのタスクが完了するshutdown()
と呼び出されることですが、実行中のタスクから追加のタスクを送信する必要があります。service2
service1
service2
service2
私の質問:
- 送信されたすべてのタスクの実行が終了した後に再実行しますか
shutdown()
、それともすぐに戻りますが、既に送信されたタスクの実行を停止しませんか? 更新:以下に回答 - 新しい問題を解決するにはどうすればよいですか?