java - 关闭ExecutorService

标签 java multithreading interrupted-exception

根据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/

相关文章:

java - 使用 hibernate 用数据填充表的正确方法

带线程的 Java 定时器

java - 中断异常 e

java - 为什么这里抛出中断异常...原因?

java - Thawte证书查询

java - 如何从 http 服务器返回 session ID

java - 隐藏接口(interface)后面的多个(给定)实现

vb.net - 如何知道线程中的工作何时完成?

iphone - performSelector 在所有实例上进入方法,但只有一个线程完成

java - 您如何找到 Java 中 sleep 中断的根本原因?