我想知道shutdown()
和shutdownNow()
在关闭Executor Service
方面的基本区别
据我所知,:
shutdown()
应该用于优雅的关机,这意味着所有正在运行并排队等待处理但未启动的任务都应该被允许完成。
shutdownNow()
会突然关闭,这意味着一些未完成的任务被取消,而未启动的任务也被取消。还有什么东西是我遗漏的吗?
P.S:我在如何关闭执行器服务上发现了另一个与此相关的问题,但并不完全是我想知道的。
发布于 2012-07-17 10:05:14
总之,你可以这样想:
shutdown()
只会告诉executor服务它不能接受新的任务,但是已经提交的任务继续运行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...");
}
发布于 2015-09-15 10:00:33
shutdown()
要终止ExecutorService中的线程,您可以调用它的shutdown()
方法。ExecutorService不会立即关闭,但它将不再接受新任务,一旦所有线程都完成了当前任务,ExecutorService就会关闭。调用关机()之前提交给ExecutorService的所有任务都将被执行。
shutdownNow()
如果要立即关闭ExecutorService,可以调用shutdownNow()
方法。这将尝试立即停止所有执行任务,并跳过所有已提交但未处理的任务。对于执行的任务,没有任何保证。也许他们停止了,也许执行到最后。这是最大的努力尝试。
发布于 2012-07-17 10:06:04
来自javadocs
void shutdown
启动有序关机,执行以前提交的任务,但不接受任何新任务。List<Runnable> shutdownNow()
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 除了尽力停止处理积极的执行任务之外,没有任何保证是肯定的。 例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。 返回:从未开始执行的任务列表
https://stackoverflow.com/questions/11520189
复制相似问题