获取在一段时间内完成的所有期货?

时间:2016-01-29 17:15:25

标签: java executorservice java.util.concurrent

我有一个callables列表,我想要并行启动它们,给它们5秒完成,并使用在那段时间内完成的任何任务的结果。

我尝试使用executorService.invokeAll超时,但在这种情况下,他们都需要在我的超时之前完成。

使用Java 7执行此操作的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

我所做的是提交所有任务并将期货添加到列表中。

然后您可以等待超时,并获得isDone()为真的所有期货。

或者,您可以根据剩余时间减少超时时间来调用每个期货的收益。

答案 1 :(得分:1)

如果使用Future

终止isDone,请在5点后查看
List<Callable<V>> callables = // ...
ExecutorService es = Executors.newFixedThreadPool(callables.size()));
List<Future<V>> futures = es.invokeAll(callables);

// Wait 5s
Thread.sleep(5000);

List<V> terminatedResults = new ArrayList<>();
for(Future<V> f : futures) {
    if(f.isDone()) {
        terminatedResults.add(f.get());
    } else {
        // cancel the future?
    }
}
// use terminatedResults

答案 2 :(得分:0)

好的,答案帮助我找到了解决方案。 Logeart答案的问题在于我想给他们一个最长的时间 - 所以如果他们完成得更快,我会把它们全部搞定(对不起,如果这个问题不清楚)。

另一个问题是isDone()在取消任务时没有捕获 - 你需要使用isCancelled()。所以,我的工作解决方案是:

Ann[]