我在我的应用程序中使用 ScheduledExecutorService 。我需要在某个Utility类中不时使用它来运行预定的线程。
在静态字段中保存 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);
}
谢谢
答案 0 :(得分:6)
您应该始终调用shutdown()或shutdownNow()。如果你不这样做,你的应用程序可能永远不会终止,因为仍有活动的线程(取决于你是如何终止你的应用程序,无论它是否在托管环境中等)。
通常你会从某种生命周期事件方法中调用shutdown() - 比如从Spring的DisposableBean.destroy()调用,或者如果你没有使用任何框架,只需在退出应用程序之前调用它。
答案 1 :(得分:3)
有效的Java 2nd Ed说:
以下是如何告诉执行者优雅地终止(如果你没有这样做,那就是 很可能你的VM不会退出):
executor.shutdown();