Java ExecutorService什么时候调用shutdown()

时间:2013-10-17 04:13:08

标签: java multithreading

我是Java多线程的新手。我正在使用ExecutorService下载一堆网页进行分析。目前我的方法是提交所有Callables并将Future对象放在一个循环列表中,然后调用shutdown()awaitTermination(),最后我处理将来的列表。
我的问题是在我的情况下,在填写这样的未来列表之后放置shutdown()是否可以?由于Future的get()已经阻塞,直到任务完成,似乎我应该在完成处理所有未来时调用它。

3 个答案:

答案 0 :(得分:1)

请注意shutdown()

的javadoc
  

启动以前提交的任务的有序关闭   已执行,但不会接受任何新任务。调用没有   如果已经关闭,则会产生额外的影响。

这是一个干净的停止。提交的任务将一直运行,直到完成。由于您还有awaitTermination()

  

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

您的Future#get()方法调用将立即返回(如果awaitTermination()没有超时)。你正在做的事情没有问题。


确保您的任务不会永远运行。

答案 1 :(得分:1)

有两种方法

1. shutdown()

正如@Sotirios所说,线程将完成当前任务,但没有添加任何新任务来执行。所以当前任务将完成

2. shutdownNow()

它突然终止了所有任务。

因此,通过使用shutdown()方法,您可以检查天气是否已完成所有任务,并且可以等到所有任务完成。 为了实现你想要的,你可以在无限循环中使用isTerminated()方法

while(!isTerminated());

所以当完成所有完成的下一个连续动作时。

答案 2 :(得分:0)

使用线程 pool 没有意义,如果你在使用它后关闭它。它旨在允许您重用线程。

相反,将Executor置于静态字段中(或更好,将其注入像Spring这样的DI框架)。然后使用java.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>>),阻止直到所有您提交的任务完成。