Как происходит отключение у исполнителей? - PullRequest
1 голос
/ 28 марта 2012

У меня есть ScheduledExecutorService, и я выполняю задачу каждые 15 минут (в веб-приложении в Tomcat).
За ServletContextListener в contextDestroyed я выполнил:

Runtime.getRuntime().addShutdownHook(new Thread(){  
            @Override  
            public void run(){  
                scheduler.shutdown();   
            }   
        });    

Планировщик запускается как:

final Runnable r = new Runnable(){

            @Override
            public void run() {
                System.out.println("My task");
                //Do some task
            }

        };
updater.scheduleWithFixedDelay(r, 30, 15, TimeUnit.MINUTES);

Вопрос: Вкл. shutdown не выполняется ни одна оставшаяся задача.
Выполняется задача, но я не вижу никаких журналов, поэтому кажется, что онане выполняется.Зачем?

ОБНОВЛЕНИЕ:
Если я запускаю tomcat, а затем через 2 минуты выключаюсь, то задача не считается запланированной и должна выполняться?Я имею в виду, если задание отправлено, не считается ли оно ожидающим?Или это должно быть на самом деле работает?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Чтобы явно дождаться завершения всех запущенных задач, сделайте что-то вроде этого:

try {
  // Wait for one second indefinitively
  while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) {
    // wait until completion
  }
} catch (final InterruptedException ex) {
  // interrupted... you may log something
}
0 голосов
/ 28 марта 2012

Я не могу разобрать ваш вопрос, но, возможно, ваше приложение не завершает работу, как вы ожидаете?

Завершение работы Executor остановит выполнение всех заданий, которые будут отправлены, но все запущенные задачи продолжат выполняться до их выхода. Из shutdown() Javadocs:

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

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

...