根据documentation ,当调用 shutdown()
时,任何已经提交的任务(我假设通过 submit()
或 execute
)都将被执行。当调用 shutdownNow() 时,执行器将停止所有等待处理的任务,并尝试停止主动执行的任务。
我想澄清的是“等待处理”的确切含义。例如,假设我有一个执行程序,并且我对一些 Runnable
对象调用 execute()
(假设所有这些对象实际上都忽略了中断)。我知道,如果我现在调用 shutdown
,无论如何,所有这些对象都将完成执行。
但是,如果我此时调用shutdownNow
,是否会与调用shutdown
具有相同的效果?或者有些对象没有执行?换句话说,如果我希望执行程序尽快退出,最好的选择是始终调用 shutdownNow(),即使将 Runnables 全部传递给执行程序时也是如此。有效地忽略干扰?
最佳答案
假设您有一个出色的 Runnable
,一旦启动,它在 10 秒内不会被中断:
Runnable r = new Runnable() {
@Override
public void run() {
long endAt = System.currentTimeMillis() + 10000;
while (System.currentTimeMillis() < endAt);
}
};
你有一个只有 1 个线程的执行器,并且你调度了可运行 10 次:
ExecutorService executor = Executors.newFixedThreadPool(1);
for (int i = 0; i < 10; i++)
executor.execute(r);
现在您决定调用shutdown
:
- 执行器持续完整的 10 x 10 秒,所有计划的事情都将被执行。这些任务看不到您正在关闭其执行程序。如果您想要一个“短暂”的执行器来执行一些任务,则可以使用
shutdown
。您可以立即调用shutdown
,稍后它就会被清理。
或者shutdownNow()
:
- 需要 10 秒。尝试中断已经运行的任务,但这显然没有效果,因此它继续运行。仍在队列中等待的其他 9 个任务将被“取消”并作为列表返回给您,以便您可以对它们执行某些操作,例如稍后安排它们。如果第一个任务尚未开始,也可能需要 0 秒。你会拿回所有任务。每当您想要中止整个执行程序时,就可以使用该方法。
关于java - 关闭ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33771020/