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()

戻り値:タスクを表すFutureのリストで、指定されたタスクリストのイテレータによって生成されたのと同じ順序で、それぞれが完了しています。

于 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 に答える