要約すると、あなたはそれをそのように考えることができます:
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...");
}