我想知道的基本区别shutdown()
和shutdownNow()
用于关闭Executor Service
?据我了解shutdown()
应该用于正常关闭,这意味着人乳宁,并排队等待处理,但尚未开始的所有任务应该可以完成和shutdownNow()
不会突然关机意味着一些未完成的任务被取消,尚未启动的任务也被取消。 还有什么是隐性/明确的,我很想念?
PS:我发现了另一个问题,关于SO与此相关的,但不是我想知道到底是什么。
我想知道的基本区别shutdown()
和shutdownNow()
用于关闭Executor Service
?据我了解shutdown()
应该用于正常关闭,这意味着人乳宁,并排队等待处理,但尚未开始的所有任务应该可以完成和shutdownNow()
不会突然关机意味着一些未完成的任务被取消,尚未启动的任务也被取消。 还有什么是隐性/明确的,我很想念?
PS:我发现了另一个问题,关于SO与此相关的,但不是我想知道到底是什么。
综上所述,可以认为这样的说法:
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...");
}
shutdown()
要终止调用其内部的ExecutorService线程shutdown()
方法。 该ExecutorService的不会立即关闭,但将不再接受新的任务,而一旦所有线程都完成当前任务,在ExecutorService的关闭。 ()关闭之前提交给ExecutorService的所有任务被调用时,被执行。
shutdownNow()
如果你想立即关闭ExecutorService的,你可以调用shutdownNow()
方法。 这将尝试停止所有正在执行的任务的时候了,并跳过所有提交,但不处理的任务。 没有关于执行任务作出的担保。 也许他们停下来,也许是执行,直到结束。 这是一个最好的努力尝试。
从的javadoc :
void shutdown
在启动以前已提交任务的执行一个有序的关闭,但没有新的任务将被接受。
List<Runnable> shutdownNow()
尝试停止所有正在执行的任务,暂停等待任务的处理,并返回等待执行的任务列表。
有没有保证尽最大努力,试图积极停止处理执行任务。
例如,典型的实现将通过了Thread.interrupt(),从而无法对中断可能永远不会终止响应的任何任务取消。
返回:从未开始执行的任务列表