RejectedExecutionException, даже если ExecutorService защищен isShutdown () - PullRequest
2 голосов
/ 28 июня 2011

У меня есть проблема, которая на какое-то время сводит меня с ума, и мне нужно проконсультироваться с вашей коллективной мудростью.

У меня есть ThreadPoolExecutor с пулом 1, который вызывается из Executors.newFixedThreadPool. Я защищаю все executor.execute () с помощью! IsShutdown (), поскольку executor.shutdown () вызывается из другого потока, и поэтому должен иметь возможность сказать, что исполнитель не будет генерировать исключение RejectedExecutionException. Тем не менее, это то, что я вижу случайно.

У кого-нибудь есть хорошая идея, почему я вижу такое поведение?

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Вы можете просмотреть статью о двойной проверке блокировки , чтобы понять, как / почему несинхронизированный подход "если тогда действует" не работает в Java.

Излюбопытство, зачем вам проверять, будет ли работа отклонена?Я не могу вспомнить, как это делалось раньше.Вместо этого, почему бы не перехватить и обработать какие-либо выданные исключения RejectedExecutionException?

Также будьте осторожны с тем, как вы обрабатываете другие условия ошибки, особенно задачи, которые выполняются или ожидают в очереди при вызове shutdown.Глава 7 «Параллелизм Java на практике» содержит много полезной информации об этом.

0 голосов
/ 28 июня 2011

Существуют и другие причины отказа в исполнении, которые изложены здесь http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Скорее всего, ваша очередь достигла своих границ.

...