我是Java多线程的新手。我正在使用ExecutorService
下载一堆网页进行分析。目前我的方法是提交所有Callables并将Future对象放在一个循环列表中,然后调用shutdown()
和awaitTermination()
,最后我处理将来的列表。
我的问题是在我的情况下,在填写这样的未来列表之后放置shutdown()
是否可以?由于Future的get()
已经阻塞,直到任务完成,似乎我应该在完成处理所有未来时调用它。
答案 0 :(得分:1)
请注意shutdown()
启动以前提交的任务的有序关闭 已执行,但不会接受任何新任务。调用没有 如果已经关闭,则会产生额外的影响。
这是一个干净的停止。提交的任务将一直运行,直到完成。由于您还有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>>)
,阻止直到所有您提交的任务完成。