我是 Java 多线程的新手。我正在使用ExecutorService
下载一堆网页进行分析。目前我的方法是提交所有 Callables 并将 Future 对象放在一个循环中的列表中,然后调用shutdown()
and awaitTermination()
,最后我处理未来列表。
我的问题是在我的情况下,这样shutdown()
填写未来列表后可以放吗?由于get()
Future 已经阻塞,直到任务完成,似乎我应该在完成所有期货处理后调用它。
3 回答
有两种方法
1. shutdown()
正如@Sotirios 所说,线程将完成当前任务但没有添加任何新任务来执行。所以当前任务将运行完成
2. shutdownNow()
它突然终止所有任务。
因此,通过使用该shutdown()
方法,您可以检查天气所有任务是否完成,并且可以等到所有任务完成。为了实现你想要的,你可以使用isTerminated()
无限循环中的方法作为
while(!isTerminated());
因此,当所有完成时,将采取下一个顺序动作。
注意javadocshutdown()
启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用没有额外的效果。
这是一个干净的停止。提交的任务将一直运行,直到完成。既然你也awaitTermination()
有
在关闭请求后阻塞,直到所有任务都完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。
您的Future#get()
方法调用将立即返回(如果awaitTermination()
没有超时)。你在做什么没有问题。
确保您的任务不会永远运行。
如果在使用后将其关闭,则使用线程池毫无意义。它旨在允许您重用线程。
相反,将其Executor
放在一个静态字段中(或者更好的是,将其注入一个像 Spring 这样的 DI 框架)。然后使用java.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>>)
, 阻止,直到您提交的所有任务都完成。