Stop Executor, когда Callable возвращает определенный результат - PullRequest
2 голосов
/ 09 февраля 2011

Я бы хотел, чтобы исполнитель не запускал больше объектов 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 ]

2 голосов
/ 10 февраля 2011

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

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

В начале этого JavaDoc есть два примера, а второй говорит:

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

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

0 голосов
/ 09 февраля 2011

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

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