Java Futures的无序返回

Ral*_*lph 12 java concurrency future

我可以使用Java Futures(java.util.concurrent.Future<T>)运行多个类似进程(SIMD)的唯一模型如下:

class Job extends Callable<T> {
  public T call() {
    // ...
  }
}
List<Job> jobs = // ...
List<Future<T>> futures = ExecutorService.invokeAll(jobs);
for (Future<T> future : futures) {
  T t = future.get();
  // Do something with t ...
}
Run Code Online (Sandbox Code Playgroud)

此模型的问题在于,如果作业0需要很长时间才能完成,但作业1,2和3已经完成,则for循环将等待从作业0获取返回值.

是否有任何模型允许我获得每个Future结果,因为它变得可用而不只是呼叫Future.isDone()和忙碌等待(或呼叫Thread.sleep())如果没有准备好了吗?

Tho*_*lut 15

你可以尝试ExecutorCompletionService:

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html

您只需提交任务并致电直到您收到所有期货.


Jon*_*eet 14

考虑使用ListenableFuture番石榴.它们让你在未来完成时基本上添加一个继续执行.