两者有什么区别?
ExecutorService eService = Executors.newFixedThreadPool(2);
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
eService.shutdown();
和
eService.shutdown();
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
我不太明白shutdown()
。此方法不等待以前提交的任务完成执行。这是否意味着shutdown()
可以终止已提交但未完成的任务?我试了几个例子,他们没有证明,请给我一个例子。
发布于 2013-08-25 02:20:07
你应该先打电话给shutdown
。否则,您可能会等待很长时间,因为awaitTermination
实际上并没有关闭您的执行器。
如果您希望等待任务完成,而不是等待执行器关闭,那么您应该使用invokeAll
。
发布于 2013-08-25 05:29:44
阅读文档总是有帮助的:
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。从此方法返回时,将从任务队列中删除这些任务。 此方法不等待主动执行任务终止。使用awaitTermination来执行任务。 除了尽力停止处理积极执行的任务之外,没有任何保证。此实现通过Thread.interrupt()取消任务,因此任何未能响应中断的任务都永远不会终止。
启动有序关闭,执行先前提交的任务,但不会接受任何新任务。如果已经关闭,则调用不会产生附加影响。 此方法不等待以前提交的任务完成执行。使用
awaitTermination
来完成这个任务。
阻塞,直到所有任务在关闭请求之后完成执行,或者超时发生,或者当前线程被中断,以先发生者为准。
发布于 2013-08-25 04:45:55
关机意味着执行器服务不再接受传入的任务。
在关闭请求后调用awaitTermination。
您需要首先关闭服务,然后阻塞并等待线程完成。
如果希望看到所有线程完成运行并坚持使用awaiTermination
,则需要将超时参数设置为足够大。所以你可以:
eService.shutdown();
if (!eService.awaitTermination(60000, TimeUnit.SECONDS))
System.err.println("Threads didn't finish in 60000 seconds!");
}
或者,你也可以这样做:
eService.shutdown();
while (!eService.isTerminated()) {
}
通过这种方式,您可以确保所有线程都已完成运行,除非它们意外中断。
https://stackoverflow.com/questions/18425026
复制相似问题