ScheduledExecutorService:何时应该调用关机?

2022-09-02 13:43:27

我在我的应用程序中使用 ScheduledExecutorService。我需要不时地在某些实用程序类中使用它来运行调度线程。

在静态字段中保持 ScheduledExecutorService 是一个好的设计吗?在这种情况下,是否必须调用 ScheduledExecutorService.shutdown()?如果我不调用关机,会带来什么风险?

这就是我的想法:

private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5);

public void scheduleTask(String name) {
        Future<?> future = futuresMapping.get(name);
        if(future!=null && !future.isDone())
            future.cancel(true);

        //execute once   
        Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES);
        futuresMapping.put(name, f);
}

谢谢


答案 1

您应该始终调用 shutdown() 或 shutdownNow()。如果不这样做,您的应用程序可能永远不会终止,因为仍有线程处于活动状态(取决于您终止应用程序的方式,无论它是否在托管环境中等)。

通常你会从某种生命周期事件方法调用 shutdown(),例如从 Spring 的 DisposableBean.destroy() 调用 shutdown(),或者如果你没有使用任何框架,只需在退出应用之前调用它。


答案 2

有效的Java 2nd Ed说:

下面介绍如何告诉执行程序正常终止(如果失败,VM 很可能不会退出):

executor.shutdown();


推荐