关闭ExecutorService

时间:2015-11-18 02:52:49

标签: java multithreading interrupted-exception

根据documentation,当调用shutdown()时,将执行已提交的任何任务(我假设通过submit()execute)。调用shutdownNow()时,执行程序将暂停所有等待处理的任务,并尝试停止主动执行任务。

我想澄清的是"等待处理的确切含义。"例如,假设我有一个执行程序,我在一些execute()个对象上调用Runnable(假设所有这些对象都有效地忽略了中断)。我知道如果我现在调用shutdown,所有这些对象都将完成执行,无论如何。

但是,如果我此时调用shutdownNow,它是否会与调用shutdown具有相同的效果?或者是一些未执行的对象?换句话说,如果我希望执行程序尽可能快地退出,那么我最好选择调用shutdownNow(),即使传递给执行程序的Runnables都有效地忽略了中断吗?

3 个答案:

答案 0 :(得分:1)

  

我想澄清的是“等待处理”的确切含义。

这意味着所有尚未调用run()方法的任务(由执行者)。

  

如果我此时调用shutdownNow,它是否会与调用shutdown相同?

没有

  

或者有可能某些对象不会被执行吗?

这是正确的。

  

换句话说,如果我希望执行程序尽可能快地退出,那么我最好选择调用shutdownNow(),即使Runnables传递给执行程序都会有效地忽略中断吗?

这是正确的。

更好的是,重新编码Runnables以注意中断...或者在关机时设置超时...

答案 1 :(得分:0)

shutdownNow方法的API说:

  

除了努力尝试停止处理之外,没有任何保证   积极执行任务。例如,典型的实现方式   通过Thread.interrupt()取消,因此任何无法响应的任务   中断可能永远不会终止。

source

答案 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

  • 执行程序将持续整个10 x 10秒,并且将执行所有计划的任务。任务没有看到你关闭他们的执行者。如果你想要一个“短暂的”执行器只是为了几个任务,可以使用shutdown。您可以立即致电shutdown,稍后会清理它。

另外shutdownNow()

  • 需要10秒钟。尝试中断已经运行的任务,但这显然没有效果,因此它继续运行。队列中仍在等待的其他9个任务被“取消”并作为列表返回给您,这样您就可以对它们执行某些操作,比如稍后安排它们。如果第一个任务尚未启动,也可能需要0秒。你将恢复所有任务。只要您想中止整个执行程序,就会使用该方法。