发布
社区首页 >问答首页 >关闭和awaitTermination哪个第一个调用有什么不同?

关闭和awaitTermination哪个第一个调用有什么不同?
EN

Stack Overflow用户
提问于 2013-08-25 02:17:49
回答 9查看 111.7K关注 0票数 70

两者有什么区别?

代码语言:javascript
代码运行次数:0
复制
ExecutorService eService = Executors.newFixedThreadPool(2);
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
eService.shutdown();

代码语言:javascript
代码运行次数:0
复制
eService.shutdown();
eService.awaitTermination(1, TimeUnit.NANOSECONDS);

我不太明白shutdown()。此方法不等待以前提交的任务完成执行。这是否意味着shutdown()可以终止已提交但未完成的任务?我试了几个例子,他们没有证明,请给我一个例子。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-08-25 02:20:07

你应该先打电话给shutdown。否则,您可能会等待很长时间,因为awaitTermination实际上并没有关闭您的执行器。

如果您希望等待任务完成,而不是等待执行器关闭,那么您应该使用invokeAll

票数 79
EN

Stack Overflow用户

发布于 2013-08-25 05:29:44

阅读文档总是有帮助的:

shutdownNow

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。从此方法返回时,将从任务队列中删除这些任务。 此方法不等待主动执行任务终止。使用awaitTermination来执行任务。 除了尽力停止处理积极执行的任务之外,没有任何保证。此实现通过Thread.interrupt()取消任务,因此任何未能响应中断的任务都永远不会终止。

关机

启动有序关闭,执行先前提交的任务,但不会接受任何新任务。如果已经关闭,则调用不会产生附加影响。 此方法不等待以前提交的任务完成执行。使用awaitTermination来完成这个任务。

awaitTermination

阻塞,直到所有任务在关闭请求之后完成执行,或者超时发生,或者当前线程被中断,以先发生者为准。

票数 56
EN

Stack Overflow用户

发布于 2013-08-25 04:45:55

关机意味着执行器服务不再接受传入的任务。

在关闭请求后调用awaitTermination

您需要首先关闭服务,然后阻塞并等待线程完成。

如果希望看到所有线程完成运行并坚持使用awaiTermination,则需要将超时参数设置为足够大。所以你可以:

代码语言:javascript
代码运行次数:0
复制
eService.shutdown();
if (!eService.awaitTermination(60000, TimeUnit.SECONDS))
    System.err.println("Threads didn't finish in 60000 seconds!");
}

或者,你也可以这样做:

代码语言:javascript
代码运行次数:0
复制
eService.shutdown();
while (!eService.isTerminated()) {

}

通过这种方式,您可以确保所有线程都已完成运行,除非它们意外中断。

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

https://stackoverflow.com/questions/18425026

复制
相关文章

相似问题

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