5

我有一组 Callables 和一个 ExecutorService。当我调用All 时,我得到一个Future 对象列表。在 Future 完成之前,如何判断哪个 Future 对象映射到哪个 Callable?事后我可以告诉你,因为

代码:

 ExecutorService es = .....;

 Collection<Callables> uniqueCallables = .....;  // each Callable is unique!

 List<Future> futures = es.invokeAll(uniqueCallables);

 // TODO--find unique Future A which is the future for Callable A!
4

2 回答 2

10

基于Java 参考invokeAll(uniqueCallables)将订单保留为由以下List<Future>生成的订单uniqueCallables.iterator()

Returns:代表任务的 Futures 列表,其顺序与迭代器为给定任务列表生成的顺序相同,每个任务都已完成。

于 2012-04-24T19:44:15.650 回答
4

听起来您只需要能够从 Future 中查找原始可调用对象。如果您没有使用 invokeAll,则可以装饰包装 submit() 的 Executor 以创建一个 ContextualFuture 来保留对原始可调用对象的引用。

/*pseudo example*/
class ContextualFuture<RETURN> implements Future<RETURN> {
   private Callable<RETURN> callable;
   private Future<RETURN> wrappedFuture;
   public ContextualFuture(Callable<RETURN> callable, Future<RETURN> future){
       this.callable = callable;
       this.future = future;
   }
   // implemented/wrapped methods 
}

class ContextualThreadPool {
   private ExecutorService wrappedExecutor;
   public <T> ContextualFuture<T> submit(Callable<T> task){
       Future<T> f = wrappedExecutor.submit(task);
       return new ContextualFuture<T>(task, f);
   }
}
于 2013-04-06T01:36:15.207 回答