我有一个callables列表,我想要并行启动它们,给它们5秒完成,并使用在那段时间内完成的任何任务的结果。
我尝试使用executorService.invokeAll超时,但在这种情况下,他们都需要在我的超时之前完成。
使用Java 7执行此操作的最佳方法是什么?
答案 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[]