我目前正在重构一段代码,几乎是这样的:
public static void main(String... args) {
while (true) {
// Do something...
Thread.sleep(300000); // Every 5 minutes
}
}
这个想法是我想使用 aScheduledExecutorService
来运行代码:
public static void main(String... args) {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Task(...), 0, 5, TimeUnit.MINUTES);
}
不过,我对此有一些担忧:首先,程序main()
在调度后“终止”(如返回),但 JVM 保持活动状态,因为它ScheduledExecutorService
仍在运行。我相信这是故意的,为了保持旧代码的“一直运行直到从外部终止”的行为,但我相信我必须安装一个关闭挂钩以确保ScheduledExecutorService
正确关闭。真的会是这样,还是“从外部杀死”也会阻止执行关闭挂钩?
其次,我也对首先有一个关闭钩子感到不安。如果我有类似的代码
try {
while (true) {}
} finally {
// Shutdown hook code goes here instead
service.shutdown();
if (!service.awaitTermination(1, TimeUnit.SECONDS)) {
service.shutdownNow();
}
}
是否还会存在与上述相同的“从外部杀死”的担忧?
编辑:是的,原始程序循环通过而没有打破循环;它只是从 SIGINT (终端中的 control-C)终止。这是一个定义不明确的终止条件,但这是我现在唯一拥有的东西......