2016-12-27 6 views
0

Javadocsによると、shutdown()はすべてのサブミットタスクが実行されるのを待ちます。私は2つの質問があります:シャットダウン後のExecutorService.awaitTermination()の必要性

  • 投稿されたタスクは何を意味していますか? ExecutorService.submit()メソッドによってタスクを具体的に提出する必要があるか、ExecutorService.execute()メソッドから送信されたタスクも含まれていますか?
  • 私はExecutorService.shutdown()を呼び出すシャットダウンフックを追加しました。ドキュメントごとに、すべてのサブミットタスクが実行されるのを待つ必要があります。しかし、shutdown()コールの後にawaitTermination()コールを追加するまではありません。なぜそれはawaitTermination()コールなしですべてのタスクを実行しないのですか?

答えて

1

送信されたタスクは何を意味しますか? ExecutorService.submit()メソッドによってタスクを具体的に提出する必要があるか、ExecutorService.execute()メソッドから送信されたタスクも含まれていますか?

「送信済み」タスクとは、ExecutorServiceに渡されたRunnableまたはCallableのことです。 javadocの表現は少し混乱しますが、​​とsubmit()の区別はありません。

私はExecutorService.shutdown()を呼び出すシャットダウンフックを追加しました。ドキュメントごとに、すべてのサブミットタスクが実行されるのを待つ必要があります。しかし、shutdown()コールの後にawaitTermination()コールを追加するまではありません。なぜそれはawaitTermination()コールなしですべてのタスクを実行しないのですか?

shutdown()操作は、ExecutorService APIのほぼすべてのメソッドと同様に非ブロッキング(非同期)です。 javadocは、shutdown()を呼び出してを起動すると、シャットダウンシーケンスが開始されます。

ここで重要なのは、ExecutorServiceのがすべてのタスクが完了するのを待つためにを尽くすということですが、shutdown()はあなたの主なメソッドが終了する前に、コードの最後の行であれば、System.exit()はあなたのメインメソッドの終了後に呼び出さされますJVMを終了し、実行中のタスクが完了するのを待つExecutorServiceの試行を上書きします。私はが常にSystem.exit()を遅らせることは望ましくないと考えており、ブロッキングコール(つまりawaitTermination)へのオプトインアプローチを希望します。

関連する問題