2012-04-24 4 views
4

У меня есть коллекция Callables и ExecutorService. Когда я вызываюAll, я возвращаю список объектов Future. Как я могу определить, какой будущий объект сопоставлен с тем, что Callable before the Future завершает? Я могу сказать потом потому чтоJava Concurrency: Как я могу определить, какое будущее принадлежит к которому 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! 
+1

Просто вне интереса, зачем вам нужна такая информация? –

+0

Фьючерсы могут (будут) заполняться в разное время, возможно, минуты друг от друга. Я различаю различные типы задач по ID. Кто-то другой может захотеть запустить ту же задачу (по ID), но не осознает, что она уже выполняется. invokeAll был плохим выбором - в итоге с отправкой, потому что invokeAll не возвращается до тех пор, пока все задачи не будут завершены/тайм-аут. – CStepnitz

ответ

8

На основе Java reference, invokeAll(uniqueCallables) сохраняет порядок в List<Future> в порядке производства по uniqueCallables.iterator():

возвратов: Перечень Фьючерсы, представляющие задачи, в том же последовательном порядке, создаваемом итератором для данного списка задач, , каждый из которых завершен.

2

Похоже, вы просто должны быть в состоянии найти оригинал, который можно вызывать из Будущего. Если вы не используете invokeAll, вы можете украсить Executor, обертывая submit(), чтобы создать 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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^