根据documentation,当调用shutdown()
时,将执行已提交的任何任务(我假设通过submit()
或execute
)。调用shutdownNow()
时,执行程序将暂停所有等待处理的任务,并尝试停止主动执行任务。
我想澄清的是"等待处理的确切含义。"例如,假设我有一个执行程序,我在一些execute()
个对象上调用Runnable
(假设所有这些对象都有效地忽略了中断)。我知道如果我现在调用shutdown
,所有这些对象都将完成执行,无论如何。
但是,如果我此时调用shutdownNow
,它是否会与调用shutdown
具有相同的效果?或者是一些未执行的对象?换句话说,如果我希望执行程序尽可能快地退出,那么我最好选择调用shutdownNow()
,即使传递给执行程序的Runnables
都有效地忽略了中断吗?
答案 0 :(得分:1)
我想澄清的是“等待处理”的确切含义。
这意味着所有尚未调用run()
方法的任务(由执行者)。
如果我此时调用shutdownNow,它是否会与调用shutdown相同?
没有
或者有可能某些对象不会被执行吗?
这是正确的。
换句话说,如果我希望执行程序尽可能快地退出,那么我最好选择调用shutdownNow(),即使Runnables传递给执行程序都会有效地忽略中断吗?
这是正确的。
更好的是,重新编码Runnables以注意中断...或者在关机时设置超时...
答案 1 :(得分:0)
shutdownNow
方法的API说:
除了努力尝试停止处理之外,没有任何保证 积极执行任务。例如,典型的实现方式 通过Thread.interrupt()取消,因此任何无法响应的任务 中断可能永远不会终止。
答案 2 :(得分:0)
让我们说你有这个神话般的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
:
shutdown
。您可以立即致电shutdown
,稍后会清理它。另外shutdownNow()
: