我有一个 ScheduledExecutorService
,我每 15 分钟执行一次任务(在 Tomcat 中的 Web 应用程序中)。
在 contextDestroyed
的 ServletContextListener
中我做了:
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);
问题:在关机
时,任何剩余的任务都不会执行。
有一个任务正在运行,但我没有看到任何日志,所以它似乎没有执行。为什么?
更新:
如果我启动 tomcat,然后在 2 分钟后关闭,那么任务是否被视为已安排且必须运行?我的意思是如果提交了一个任务,它不被认为是待处理的吗?或者它必须实际运行?
最佳答案
要显式等待所有正在运行的任务完成,请执行以下操作:
try {
// Wait for one second indefinitively
while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) {
// wait until completion
}
} catch (final InterruptedException ex) {
// interrupted... you may log something
}
关于java - 执行者中的关闭是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908221/