总之,你可以这样想:
-
shutdown()
只会告诉执行器服务它不能接受新任务,但已经提交的任务继续运行
-
shutdownNow()
将执行相同的操作,并将尝试通过中断相关线程来取消已提交的任务。请注意,如果任务忽略中断,则 的行为方式将与 完全相同。shutdownNow
shutdown
您可以尝试以下示例并替换为,以更好地了解不同的执行路径:shutdown
shutdownNow
- ,则输出是因为正在运行的任务未中断并继续运行。
shutdown
Still waiting after 100ms: calling System.exit(0)...
- 与 ,输出是 并且因为正在运行的任务被中断,捕获中断,然后停止它正在执行的操作(中断 while 循环)。
shutdownNow
interrupted
Exiting normally...
- 如果注释掉 while 循环中的行,则会得到,因为中断不再由正在运行的任务处理。
shutdownNow
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...");
}