关闭如何在执行程序中工作?

时间:2012-03-28 13:10:10

标签: java multithreading tomcat executorservice

我有一个ScheduledExecutorService,我每15分钟执行一次任务(在Tomcat的Web应用程序中)。
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 个答案:

答案 0 :(得分:1)

要明确等待所有正在运行的任务完成,请执行以下操作:

try {
  // Wait for one second indefinitively
  while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) {
    // wait until completion
  }
} catch (final InterruptedException ex) {
  // interrupted... you may log something
}

答案 1 :(得分:0)

我无法完全解析你的问题,但也许你的应用程序没有像你期望的那样退出?

关闭Executor将停止提交任何任务,但任何正在运行的任务将继续运行,直到退出。来自shutdown() javadocs:

  

启动先前提交的有序关闭   任务已执行,但不会接受任何新任务。   如果已经关闭,调用没有额外的效果。

如果您将问题编辑得更清楚,我们可以更恰当地回答。