根据文档,当调用shutdown()时,已经提交的任何任务(我假设通过submit()或execute)都将被执行。当调用shutdownNow()时,执行器将停止等待处理的所有任务,并尝试停止主动执行任务。
我想澄清的是“等待处理”的确切含义。例如,假设我有一个执行器,并对一定数量的execute()对象调用Runnable (假设所有这些对象实际上忽略了中断)。我知道,如果我现在调用shutdown,所有这些对象都将完成执行,不管如何。
但是,如果此时调用shutdownNow,它是否会产生与调用shutdown相同的效果?还是有些对象没有执行?换句话说,如果我希望执行器尽可能快地退出,那么我的最佳选择总是调用shutdownNow(),即使Runnables传递给执行器时也有效地忽略了中断吗?
发布于 2015-11-18 03:02:49
我想澄清的是“等待处理”的确切含义。
它意味着run()方法尚未被调用的所有任务(由执行器调用)。
如果此时调用shutdownNow,它是否会产生与调用关机相同的效果?
不是的。
或者某些对象可能不会被执行?
这是正确的。
换句话说,如果我希望一个执行器尽可能快地退出,那么我的最佳选择总是调用shutdownNow(),即使当Runnable传递给执行器时都有效地忽略了中断?
这是正确的。
更好的是,让Runnable们注意干扰.或者暂停关机..。
发布于 2015-11-18 03:37:50
假设您有一个非常棒的Runnable,它在启动后10秒内是不可中断的:
Runnable r = new Runnable() {
@Override
public void run() {
long endAt = System.currentTimeMillis() + 10000;
while (System.currentTimeMillis() < endAt);
}
};而且您有一个只有一个线程的执行器,并且将可运行的时间安排了10次:
ExecutorService executor = Executors.newFixedThreadPool(1);
for (int i = 0; i < 10; i++)
executor.execute(r);现在你决定打电话给shutdown
shutdown。您可以立即打电话给shutdown,它稍后会被清理干净。交替shutdownNow()
发布于 2015-11-18 03:04:07
shutdownNow方法的API表示:
除了尽力停止处理积极执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。
https://stackoverflow.com/questions/33771020
复制相似问题