Executor ServiceのshutdownとshutdownNowの違いについて
2023-09-20 22:39:37
質問
の基本的な違いを知りたいのですが。
shutdown()
と
shutdownNow()
をシャットダウンするための
Executor Service
?
私が理解した限りでは
shutdown()
を使用する必要があります。
優美
シャットダウンは、実行中で、処理のためにキューに入れられたが開始されていないすべてのタスクが完了することを許可されることを意味します。
shutdownNow()
は
突然の
シャットダウンします。つまり、いくつかの未完成のタスクがキャンセルされ、未着手のタスクもキャンセルされます。私が見逃している暗黙的/明示的な他の何かがありますか?
P.S.: 私は別の質問を エクゼキュータサービスをシャットダウンする方法 に、これと関連した質問がありましたが、私が知りたいこととはちょっと違います。
どのように解決するのですか?
要約すると、そのように考えることができます。
-
shutdown()
は、新しいタスクを受け付けないことをエグゼキュータサービスに伝えるだけで、すでに投入されたタスクは実行され続けます。 -
shutdownNow()
は同じことをしますし キャンセルしようとする を試み、関連するスレッドに割り込んで既に投入されたタスクをキャンセルします。タスクが割り込みを無視する場合は、注意してください。shutdownNow
と全く同じように動作します。shutdown
.
以下の例を試してみて
shutdown
を
shutdownNow
を使用して、実行の異なる経路をよりよく理解することができます。
-
と
shutdown
である場合、出力はStill waiting after 100ms: calling System.exit(0)...
というのは、実行中のタスクが ではなく が中断され、実行が継続されるからです。 -
で
shutdownNow
である場合、出力はinterrupted
でありExiting normally...
というのは、実行中のタスクが割り込まれ、それをキャッチして実行を停止する(whileループを中断する)ためです。 -
で
shutdownNow
というように、whileループの中の行をコメントアウトすると、次のようになります。Still waiting after 100ms: calling System.exit(0)...
となります。これは、実行中のタスクによって割り込みが処理されなくなったためです。
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("interrupted");
break;
}
}
}
});
executor.shutdown();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting after 100ms: calling System.exit(0)...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
関連
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
Junitのユニットテストエラー
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み] JavaにおけるSoftReferenceとWeakReferenceの違いは何ですか?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
Uncaught ReferenceError: は定義されていません。
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
セミコロン期待値エラー解決
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
switch case文のcaseの後の列挙定数は列挙型なし
-
ApiModel と @ApiModelProperty の使用法