获取在规定时间内完成的所有期货?

Get all futures that finish within a set period of time?

我有一个可调用项列表,我想同时启动它们,给它们 5 秒的时间来完成,并使用在该时间内完成的任何任务的结果。

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

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

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

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

或者,您可以在每个 Futures 上调用 get,根据剩余时间减少超时。

只需在 5 秒后检查 Future 是否使用 isDone:

终止
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

好的,答案帮助我找到了解决方案。 Logeart 的回答的问题是我想给他们一个最大的时间——所以如果他们完成得更快,我就会得到所有的答案(很抱歉,如果问题中不清楚)。

另一个问题是 isDone() 无法捕获任务取消时的情况 - 您需要使用 isCancelled()。所以,我的工作解决方案是:

 ExecutorService exectutorService = Executors.newCachedThreadPool();
 List<Callable<Object>> callables = Arrays.asList(
            (Callable(Object) new Check1Callable(),
            (Callable(Object) new Check2Callable(),
            (Callable(Object) new Check3Callable());

 List<Future<Object>> futures = new ArrayList<>();

 try {
     futures = executorService.invokeAll(callables,maxWaitTime, TimeUnit.SECONDS);
 } catch (Exception e) {
 }

 for (Future thisFuture : futures) {
    try {
        if (thisFuture.isDone() && !thisFuture.isCancelled()) {
           <accept the future's result>
        }
    } catch (Exception e) {
    }
 }