2009-09-30 3 views
2

У меня примерно такой код:Почему invokeAll() не возвращается?

ExecutorService threader = Executors.newFixedThreadPool(queue.size()); 
List futures = threader.invokeAll(queue); 

отладить это и invokeAll, кажется, не возвращаться, пока все нити в очереди не закончены. Любые причины, почему это происходит.

ответ

6

Выполнение поставленных задач, возвращая список фьючерсов, имеющих свой статус и результаты, когда все полные. the API

Вы должны submit() им по одному вместо этого, что-то вроде:

public static <T> List<Future<T>> submitAll (ExecutorService executor, Collection<? extends Callable<T> > tasks) { 
    List<Future<T>> result = new ArrayList<Future<T>>(tasks.size()); 

    for (Callable<T> task : tasks) 
     result.add (executor.submit (task)); 

    return result; 
} 
2

Когда мы называем invokeAll() метод, который он возвращает List<Futute<T>> объект. И этот объект Future сохраняет значение всех потоков, пока он не будет успешно выполнен. Итак, когда мы пытаемся выполнить итерацию через Future<T> объект, он сначала проверяет внутри себя Future<T>.isDone() [Мы можем или не можем проверить Future<T>.isDone() извне]. Если он вернет true, мы можем выполнить итерацию по объекту и получить доступ к значению объекта Future<T>, иначе он будет ожидать true.

Примечание: если Future<T> получает ложный объект, он не позволит вам выполнять итерацию по объекту.

ExecutorService threader = Executors.newFixedThreadPool(queue.size()); 
List<Future<T>> listFuture = threader.invokeAll(queue); 
for(Future<T> future: listFuture) { 
    // Here you have the full access to this future object 
} 
Смежные вопросы