4

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

4

3 回答 3

1

有两种方法

1. shutdown()

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

2. shutdownNow()

它突然终止所有任务。

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

while(!isTerminated());

因此,当所有完成时,将采取下一个顺序动作。

于 2013-10-17T04:58:32.143 回答
1

注意javadocshutdown()

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用没有额外的效果。

这是一个干净的停止。提交的任务将一直运行,直到完成。既然你也awaitTermination()

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

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


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

于 2013-10-17T04:18:45.140 回答
0

如果在使用后将其关闭,则使用线程毫无意义。它旨在允许您重用线程。

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

于 2013-10-17T08:14:47.383 回答