2013-04-18 4 views
12

私はExecutorService#shutdownメソッドのjavadocについて混乱しています。これらの矛盾した陳述はありませんか?ExecutorService shutdown

以前に送信したタスクが で実行されたが、新しいタスクは受け入れられないように、正常にシャットダウンを開始します。このメソッドは、実行を完了するために以前にサブミットされたタスクのために を待機しません。これを行うには awaitTerminationを使用してください。

以前に提出されたタスクを正常にシャットダウンできれば、実行が完了するまでにどのように待つことができますか?

+0

コメントは、前のタスクは破棄されないことを意味します。彼らはすぐに処刑されるというわけではありません。 'awaitTermination()'を使ってください。 –

+0

ルーチンは、すべてのタスクが終了するのを待つのではなく、ほぼ即座に戻ります。 –

答えて

13

これは、このメソッドが呼び出されたスレッドですぐに戻りますが、まだ実行されていないタスクが他のスレッドで実行されている可能性があることを意味します。

以前に送信されたタスクが終了するまでプログラムを待機させる場合は、shutdownを呼び出してからawaitTerminationに電話する必要があります。

+0

正確には、それは2つの懸念を簡単に分けます。待たずにシャットダウンする場合があります。 – user1225148

+0

awaitTermination()をExecutorServiceインスタンスの.join()を呼び出すように呼び出すことはできますか? awaitTermination()を呼び出さないと、メインスレッド(または呼び出し元スレッド)がExecutorServiceスレッドと並行して処理を続行します。 awaitTermination()を呼び出すと、メインスレッドはExecutorServiceスレッドが完了するまで実行を停止します。私の理解が正しいかどうか確認してください。 – RuntimeException

6

タスクが完了するまで実行されますが、このメソッドは、発生するのを待たずにすぐに戻ります。任意のタスクを殺すことなく、きれいにシャットダウンあなたのexecutorをするには、どうなるので

、:

また
executor.shutdown(); 
executor.awaitTermination(long timeout, TimeUnit unit); 

、あなただけshutdownNow()を使用し、可能な限り迅速にあなたのexecutorを停止する場合。

関連する問題