Stop Executor, когда Callable возвращает определенный результат

Я бы хотел, чтобы исполнитель не запускал больше объектов Future, даже если они были отправлены исполнителю. Запуск нескольких потоков, хотя Executor все работает нормально, но Executor должен остановиться, когда один из Callable возвращает Boolean TRUE. Хорошо, что текущая работа Future завершена, но это будет пустой тратой времени, чтобы продолжить остальные.

Set<Future<Boolean>> calculationSet = new HashSet<Future<Boolean>>();
threadPool = Executors.newFixedThreadPool(3);

int x = nextX();
int y = nextY();

do {
   Callable<Boolean> mathCalculation = new MathCalculation(x, y);
   Future<Boolean> futureAttempt = threadPool.submit(mathCalculation);
   calculationSet.add(futureAttempt);

   x = nextX();
   y = nextY();
} while (runSomeMore());

Где MathCalculation реализует интерфейс Callable, а его метод call() возвращает логическое значение.

Поиск набора параметров для каждой итерации невозможен, поскольку набор станет достаточно большим и, очевидно, не будет работать из-за многопоточной ситуации. Есть ли способ добиться этого?

2 ответа

Решение

Вы также можете использовать ExecutorCompletionService

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html

Вверху этого JavaDoc есть два примера, а второй говорит:

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

Это звучит многообещающе, решает ли это вашу проблему?

Если вы хотите, чтобы вызываемый объект остановил службу executor, я предлагаю вам создать оболочку или изменить вызываемый элемент, чтобы сделать это.

// performs a threadPool.shutdownNow() as required.
new MathCalculation(x, y, threadPool) 
Другие вопросы по тегам