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