«Обновление» пула потоков фиксированного размера при использовании для ExecutorService - PullRequest
2 голосов
/ 29 сентября 2010

В моем приложении я часто использую ExecutorService для выполнения асинхронных вызовов.

ExecutorService executorService = Executors.newFixedThreadPool(10);

И я отключаю executorService только тогда, когда приложение (веб-приложение) закрывается.Недавно при отладке некоторых проблем я просматривал этот код и задавался вопросом, могут ли быть случаи во время выполнения программы, когда я вынужден завершить работу ExecutorService и перезапустить его, то есть новый набор объединенных потоков.Поэтому я хотел знать, какие типичные сценарии / неожиданное поведение приложения могут заставить меня сделать это?

Типичные исключения, которые я проверяю, - ExecutionException, InterruptedException, CancellationException, но я не делаю ничего, кроме их регистрации.

1 Ответ

2 голосов
/ 15 октября 2010

Общий ответ таков: вам не нужно перерабатывать пул; это разработано, чтобы минимизировать вашу потребность сделать это. Вы можете рассмотреть два случая:

  • Резкое необработанное исключение в одной из ваших задач. В этом случае задача не будет выполнена (и у вас есть возможность перехватывать необработанные исключения через ловушки пула потоков или UncaughtExceptionHandler), и рабочий поток может завершиться. Тем не менее, пул потоков обрабатывает это чисто, и следующий запрос в пул потоков создаст замену в случае необходимости.

  • Блокировка рабочего потока. Это не так просто предсказать или обнаружить - я не могу себе представить структурирование приложения вокруг переработки пула потоков, чтобы справиться с заблокированными рабочими потоками.

Помимо этих двух краевых условий, я не вижу причин для беспокойства по поводу периодической циклической работы с новым пулом потоков.

Некоторые люди делают создают и уничтожают пулы потоков, потому что они не знают о CompletionService, удобных методах, таких как invokeAll(), и гибкости мониторинга завершения с Future с.

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