2012-03-05 5 views
0

У меня возникла проблема при попытке вызвать список вызываемых вызовов из fixedThreadPool. Хотя все вызывающие вызовы будут выполняться, некоторые из них, кажется, отправляются в разные потоки одновременно, поэтому их фактически вызывают не один раз. Смотрите код ниже:ExecutorService invokeAll() duplicates Callable, вызываемый

try { 
    ExecutorService es = Executors.newFixedThreadPool(Environment.nThreads); 
    es.invokeAll(Environment.jobPool); 
    es.shutdown(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+1

Уверены ли вы, что одна и та же задача добавлена ​​несколько раз в коллекцию, которую вы передаете в ExecutorService? Также вы уверены, что ни одна из ваших задач не бросает исключения во время их запуска? –

+3

Трудно представить, что проблема заключается в этом фрагменте кода. Как создается «Environment.jobPool»? –

+0

Это часть кода, где создается jobPool public static final ArrayList > jobPool = new ArrayList <Вызываемый >(); Здесь добавляются задания: Environment.jobPool.add (Executors.callable (новый Job (eval, validator))); @Andrei Я не вижу, как вызываемый будет вызываться дважды, даже когда бросает исключение. Я не думаю, что они все равно, поскольку я предпочитаю печатать все исключения в консоли. – Renaud

ответ

0

Вы, вероятно, дублировали некоторые из ваших Callable задач в списке. Попробуйте использовать java.util.Set, правильно применяя метод equal для каждой реализации Callable.

0

Если Callable выбрасывает неперехваченное исключение, поведение не определено. Для прерванного исключения в остановках ExecutorService, например. Кроме того, поскольку incokeAll принимает Коллекцию, построить HashSet из вашего ArrayList и передать его, что просто чтобы убедиться, что у вас нет ничего дублируется

Set<?> set = new HashSet<?>(jobPool); 

Я довольно уверен, что ExecutorService не просто позвонить то же Callable дважды.

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