首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭ExecutorService

关闭ExecutorService
EN

Stack Overflow用户
提问于 2015-11-18 02:52:48
回答 3查看 7.4K关注 0票数 2

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

我想澄清的是“等待处理”的确切含义。例如,假设我有一个执行器,并对一定数量的execute()对象调用Runnable (假设所有这些对象实际上忽略了中断)。我知道,如果我现在调用shutdown,所有这些对象都将完成执行,不管如何。

但是,如果此时调用shutdownNow,它是否会产生与调用shutdown相同的效果?还是有些对象没有执行?换句话说,如果我希望执行器尽可能快地退出,那么我的最佳选择总是调用shutdownNow(),即使Runnables传递给执行器时也有效地忽略了中断吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-18 03:02:49

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

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

如果此时调用shutdownNow,它是否会产生与调用关机相同的效果?

不是的。

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

这是正确的。

换句话说,如果我希望一个执行器尽可能快地退出,那么我的最佳选择总是调用shutdownNow(),即使当Runnable传递给执行器时都有效地忽略了中断?

这是正确的。

更好的是,让Runnable们注意干扰.或者暂停关机..。

票数 1
EN

Stack Overflow用户

发布于 2015-11-18 03:37:50

假设您有一个非常棒的Runnable,它在启动后10秒内是不可中断的:

代码语言:javascript
复制
Runnable r = new Runnable() {
    @Override
    public void run() {
        long endAt = System.currentTimeMillis() + 10000;
        while (System.currentTimeMillis() < endAt);
    }
};

而且您有一个只有一个线程的执行器,并且将可运行的时间安排了10次:

代码语言:javascript
复制
ExecutorService executor = Executors.newFixedThreadPool(1);
for (int i = 0; i < 10; i++)
    executor.execute(r);

现在你决定打电话给shutdown

  • 执行器将持续10x10秒,所有计划都将被执行。任务看不出你在关闭他们的执行者。如果您想要一个只用于几个任务的“短期”执行器,可以使用shutdown。您可以立即打电话给shutdown,它稍后会被清理干净。

交替shutdownNow()

  • 需要10秒。已经在运行的任务尝试被中断,但这显然没有影响,因此它继续运行。其他9个仍在队列中等待的任务将被“取消”,并作为列表返回给您,这样您就可以对它们做一些事情,比如稍后对它们进行调度。如果第一个任务尚未启动,也可能需要0秒。你会把所有的任务都拿回来。每当您想要中止整个执行器时,都会使用该方法。
票数 2
EN

Stack Overflow用户

发布于 2015-11-18 03:04:07

shutdownNow方法的API表示:

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

来源

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33771020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档