64

違いは何ですか

ExecutorService eService = Executors.newFixedThreadPool(2);
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
eService.shutdown();

eService.shutdown();
eService.awaitTermination(1, TimeUnit.NANOSECONDS);

よくわかりませんshutdown()。このメソッドは、以前に送信されたタスクの実行が完了するまで待機しません。shutdown()提出されたが完了していないタスクを終了できるということですか? いくつかの例を試しましたが、証明されていません。例を教えてください。

4

9 に答える 9

73

最初に電話する必要がありますshutdownawaitTerminationそうしないと、エグゼキュータが実際にシャットダウンされないため、非常に長い時間待機する可能性があります。

エグゼキューターがシャットダウンするのを待つのではなく、タスクが完了するのを待ちたい場合は、 を使用する必要がありますinvokeAll

于 2013-08-25T02:20:07.917 に答える
53

ドキュメントを読むことは常に役立ちます。

shutdownNow :

アクティブに実行中のすべてのタスクの停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。これらのタスクは、このメソッドから戻ると、タスク キューから排出 (削除) されます。

このメソッドは、アクティブに実行中のタスクが終了するのを待ちません。 そのために awaitTermination を使用します。

アクティブに実行中のタスクの処理を停止するための最善の努力以外の保証はありません。この実装は、Thread.interrupt() を介してタスクをキャンセルするため、割り込みに応答しないタスクは決して終了しない可能性があります。

シャットダウン:

以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。すでにシャットダウンされている場合、呼び出しによる追加の効果はありません。

このメソッドは、以前に送信されたタスクの実行が完了するまで待機しません。そのために使用awaitTerminationします。

awaitTermination :

シャットダウン要求の後、すべてのタスクの実行が完了するか、タイムアウトが発生するか、現在のスレッドが中断されるかのいずれか早い方までブロックします。

于 2013-08-25T05:29:44.307 に答える
3

最初のタスクを開始すると、ThreadPoolExecutor は、タスクが終了しても終了しないスレッドを開始します。少なくとも、固定スレッド プールには当てはまります。これが、シャットダウンを呼び出す必要がある理由です。シャットダウン後、ThreadPoolExecutor は新しいタスクを拒否しますが、実行中のタスクが終了するのを待ってからスレッドを終了させます。これが、シャットダウン後に awaitTermination が必要な理由です。

于 2013-08-25T04:33:07.447 に答える