Завершение работы ExecutorService - PullRequest
10 голосов
/ 16 сентября 2009

В Tomcat я написал ServletContextListener, который будет запускать ExecutorService во время запуска и завершать его при выгрузке.

Я следую примеру в javadoc для ExecutorService

public void contextDestroyed( ServletContextEvent sce )
{
    executor.shutdown();
    try
    {
        executor.awaitTermination( 50, TimeUnit.SECONDS );
    }
    catch( InterruptedException ie )
    {
        Thread.currentThread().interrupt();
    }
}

У меня вопрос, должен ли я распространять InterruptedException в методе contextDestroyed ()?

Ответы [ 3 ]

5 голосов
/ 16 сентября 2009

Я бы сказал нет. Метод contextDestroyed вызывается контейнером как уведомление о том, что контекст должен быть разрушен, оно не запрашивает вашего разрешения. Кроме того, Javadoc не определяет, что произойдет, если вы выбросите из него исключение, поэтому результаты могут быть непредсказуемыми и / или непереносимыми.

Что бы я сделал, это позвонил бы executor.shutdownNow() внутри блока catch, чтобы принудительно завершить работу исполнителя (т. Е. «У вас был шанс, теперь остановитесь»).

1 голос
/ 16 сентября 2009

То, что у вас есть в вашем примере кода (повторное прерывание текущего потока), именно то, что я бы порекомендовал. Что-то в Tomcat за пределами вашего собственного кода отправило исходное прерывание, поэтому у Tomcat есть шанс с ним справиться.

Я не знаю, что Tomcat будет делать с InterruptedException. Это не определено. Но Tomcat инициировал прерывание, и Tomcat владеет потоком, в котором выполняется метод contextDestroyed (...). Общий принцип из "Параллелизма Java на практике", который применяется здесь: создатель потока отвечает за обработку потока жизни вопросы о цилиндре.

Обработка прерываний - это определенно проблема жизненного цикла.

0 голосов
/ 27 октября 2010

Я согласен со Стивом: сброс флага прерывания дает коду, находящемуся вне вашего контроля, возможность среагировать на событие.

tempus-fugit предлагает метод убеждения, чтобы сделать это для вас, наряду с исключением времени ожидания явного объяснения.если дела займут слишком много времени

waitOrTimeout(shutdown(executor), timeout);

Загляните в раздел параллелизма документов, если он представляет интерес ... tempusfugitlibrary.org/documentation

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

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