【发布时间】:2015-10-07 00:51:25
【问题描述】:
当我使用 ScheduledExecutorService(或 ExecutorService)并提交 Runnable 时,我的关闭挂钩永远不会被调用。例如,这个程序挂起:
public class App {
static ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
static {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
exec.shutdownNow();
}
});
}
public static void main(String[] args) {
exec.schedule(new Runnable() {
@Override
public void run() {
}
}, 10, TimeUnit.SECONDS);
}
}
由于执行程序的线程不是守护程序,我希望调用关闭挂钩,但事实并非如此。知道为什么吗?
【问题讨论】:
-
您认为为什么会调用关闭挂钩?
-
我不希望调用关闭挂钩,但事实并非如此。这不是你所期望的吗?
-
@SotiriosDelimanolis 我编辑了他的问题,因为我认为这是一个错字。
-
由于执行器的线程不是守护进程 如果它不是守护进程,它必须在VM退出之前完成。
-
你应该在某个地方明确地调用
shutdownNow(),而不是通过钩子。
标签: java executorservice scheduledexecutorservice