【发布时间】:2014-08-09 03:24:12
【问题描述】:
我目前正在重构一段代码,大致如下:
public static void main(String... args) {
while (true) {
// Do something...
Thread.sleep(300000); // Every 5 minutes
}
}
想法是我想使用ScheduledExecutorService 来运行代码:
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)终止。这是一个定义不明确的终止条件,但这是我现在唯一拥有的......
【问题讨论】:
-
在使用shutdownNow()之后,你仍然需要awaitTermination()。 “从外部杀死”我认为对于 JVM 来说是未定义的行为。我怀疑是否指定了关闭挂钩是否运行。
标签: java concurrency terminate scheduledexecutorservice shutdown-hook