ExecutorService invokeAll () дублирует вызываемый вызываемый - PullRequest
0 голосов
/ 05 марта 2012

У меня проблема при попытке вызвать список вызываемых из fixedThreadPool.В то время как все вызовы будут выполняться, некоторые из них, похоже, будут отправлены в разные потоки одновременно, поэтому они на самом деле вызываются более одного раза.Смотрите код ниже:

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

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

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

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

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

0 голосов
/ 05 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...