我正在使用一个ScheduledExecutitorService,该服务计划每分钟无限运行一次
有人能告诉我什么时候调用ScheduledExecutiorService 的关闭吗
我已经调查了Guava MoreExecutitors。这不起作用,因为我需要阻塞主线程以保持其他线程连续运行
用例
我有一项任务,它不断地监视系统以检查延迟/故障。
我需要定期运行这个任务,并根据它配置Cloudwatch警报。理想情况下,我希望任务即使在出现延迟峰值时也能继续执行,因为警报会被触发
因此,我使用ScheduledExecutiorService来定期安排任务。
我想知道在执行器服务上调用shutdown((的理想位置
当前,Executors
中的工厂方法返回ScheduledThreadPoolExecutor
1的一个实例。默认情况下,ScheduledThreadPoolExecutor
在关闭后不会继续执行定期任务。您可以通过setContinueExistingPeriodicTasksAfterShutdownPolicy
对此进行配置。
设置是否继续执行现有定期任务的策略,即使此执行器已为
shutdown
。在这种情况下,执行将继续,直到shutdownNow
或策略设置为false
(此时已关闭(。默认情况下,此值为false
。
由于ScheduledExecutorService
的实现和Executors
的工厂方法返回的内容实际上是一个实现细节,因此可能最好直接创建一个ScheduledThreadPoolExecutor
。
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
executor.scheduleAtFixedRate(() -> System.out.println("Hello, World!"), 0L, 1L, TimeUnit.SECONDS);
executor.shutdown();
注意,这当前将ScheduledThreadPoolExecutor
配置为使用非守护进程线程。即使调用了shutdown
,如果不取消周期性任务,它们也会使JVM保持活动状态。如果要使用守护进程线程,请使用自定义ThreadFactory
。
1.newSingleThreadScheduledExecutor
方法返回一个不可配置的包装器,该包装器委托给ScheduledThreadPoolExecutor