Количество заданных задач (потоков) также не является огромным в этом тестовом сценарии.
Почему Executors.newCachedThreadPool запускает java.util.concurrent.RejectedExecutionException во время отправки
Ответ 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
после того, как исполнитель завершил работу.