Java: ExecutorService с Callables: повторно использовать тот же пул в цикле? Выключение необходимо? - PullRequest
0 голосов
/ 05 марта 2012

У меня есть цикл {Loop-1}, где я запускаю потоки. Класс, который содержит {Loop-1}, реализует Daemon и Runnable. В {Loop-1} поток, который запускается, вызывает метод coordinate() класса Coordinate.java, где я использую ExecutorService.

Когда создается объект Coordinate.java (это происходит однажды ДО {Loop-1}), я создаю экземпляр ExecutorService pool = Executors.newFixedThreadPool(2);

В coordinate() я создаю два объекта класса, который реализует Callable, и затем запускаю их и сохраняю результат в списке результатов будущего. callableResults = pool.invokeAll(threads);

После этого я пытаюсь получить результаты в цикле с result = future.get();

Затем я возвращаюсь к {Loop-1} и весь процесс начинается снова (звоните coordinate(), invokeAll(), future.get()

Теперь у меня есть следующий вопрос: 1. Нужно ли отключать пул ExecutorService после того, как я получил результаты в coordinate()? 2. Нужно ли заново создавать пул каждый раз, когда мои {Loop-1} звонки coordinate()?

Спасибо за ответы! : -)

Ответы [ 2 ]

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

Нет, ты не. Потоки в фиксированном пуле потоков можно использовать до тех пор, пока вы не вызовете shutdown для него. Таким образом, вы можете просто повторно отправить новые задачи для выполнения и получить их результаты точно так же, как вы это делали в первом раунде.

1 голос
/ 05 марта 2012

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

После вызова executorService.shutDown() вы можете дождаться завершения всех заданий после вызова shutDown () с помощью executorService.awaitTermination(10, TimeUnit.SECONDS).

В качестве альтернативы вы можете сделать: while (!executorService.isTerminated()) { }

...