Подтвердить что ты не робот

Почему Executors.newCachedThreadPool запускает java.util.concurrent.RejectedExecutionException во время отправки

Количество заданных задач (потоков) также не является огромным в этом тестовом сценарии.

4b9b3361

Ответ 1

Вам нужно будет предоставить образцы кода того, как вы создаете экземпляр и вызывать submit в пуле (здесь должен быть неактуальный IP-адрес, так как нам не нужны детали внутренних классов Callable или что-то еще как это).

Основываясь на информации, которую вы указали, вы почти наверняка завершите работу службы-исполнителя где-нибудь перед отправкой вызываемого на нее. Убедитесь, что вы делаете какие-либо вызовы shutdown или shutdownNow, и если да, убедитесь, что после этой задачи вы не добавляете задачи.

Кроме того, вы можете захотеть зарегистрировать собственную реализацию java.util.concurrent.RejectedExecutionHandler, чтобы помочь в отладке; его сообщение rejectedExecution будет вызываться всякий раз, когда исполнитель не сможет принять задание, поэтому вы можете поместить некоторую рудиментарную логику проверки состояния там, чтобы помочь вы найдете причину.

Ответ 2

Я не вижу нигде в вызове методов Executors.newCachedThreadPool(), где вызывается RejectedExecutionException. Есть только три случая, когда он, кажется, бросается в Java 6:

  • при вызове execute() на ThreadPoolExecutor и максимальный размер пула достигнут.
  • при вызове execute() на ThreadPoolExecutor в то же время, что shutdownNow, и по существу потерял гонку с вызовом shutdownNow.
  • при попытке запланировать выполнение runnable в ScheduledThreadPoolExecutor после того, как исполнитель завершил работу.