我想知道shutdown()
和shutdownNow()
关闭之间的基本区别Executor Service
?
据我了解:
shutdown()
应该用于正常关机,这意味着应该允许所有正在运行并排队等待处理但尚未启动的任务完成
shutdownNow()
做一个突然的关机意味着一些未完成的任务被取消,尚未启动的任务也被取消。还有其他我不知道的隐式/显式信息吗?
Answers:
总之,您可以这样考虑:
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...");
}
This method does not wait for previously submitted tasks to complete execution. Use awaitTermination to do that.
表示不等待,这与该答案相反。
awaitTermination
不会阻塞)。但是,它可以使先前提交的任务完成其工作。
shutdown()
:要终止ExecutorService内部的线程,请调用其shutdown()
方法。ExecutorService不会立即关闭,但将不再接受新任务,并且一旦所有线程都完成了当前任务,ExecutorService就会关闭。调用shutdown()之前提交给ExecutorService的所有任务都将执行。
shutdownNow()
:如果要立即关闭ExecutorService,可以调用该shutdownNow()
方法。这将尝试立即停止所有正在执行的任务,并跳过所有已提交但未处理的任务。不能保证执行任务。也许他们停下来,也许执行到最后。这是尽力而为的尝试。