ScheduledThreadPoolExecutor中有以下getter(以及随附的setter)有两个属性:
boolean getContinueExistingPeriodicTasksAfterShutdownPolicy()
获取有关是否继续执行现有定期任务的策略,即使此执行程序已关闭。在这种情况下,这些任务仅在shutdownNow时或在已经关闭时将策略设置为false后终止。默认情况下,此值为false。
boolean getExecuteExistingDelayedTasksAfterShutdownPolicy()
获取有关是否执行现有延迟任务的策略,即使此执行程序已关闭也是如此。在这种情况下,这些任务仅在shutdownNow时终止,或者在已经关闭时将策略设置为false后终止。默认情况下,此值为true。
为什么它们有不同的默认值,是否有理由更改这些属性的值?
另外,如果您只是使用Executors
静态方法创建ScheduledExecutorService
的实例(没有调整上述属性的方法),您应该如何更改/配置它们? / p>
答案 0 :(得分:2)
第一:
getContinueExistingPeriodicTasksAfterShutdownPolicy()
如果返回false,则当您关闭执行程序时,执行程序将取消/禁止所有定期任务。运行定期任务时,执行程序可以允许它们完成。将此设置为true将告诉执行程序允许所有正在运行的周期性任务完成。
第二
getExecuteExistingDelayedTasksAfterShutdownPolicy()
有些任务以初始延迟运行但不是定期运行。这确定执行程序服务是否应在关闭时取消那些非句点任务(默认为true)。
请注意,期间任务是使用scheduleAtFixedRate
计划的任务,而使用scheduleWithFixedDelay
计划非周期性任务。
为什么它们有不同的默认值,是否有理由更改这些属性的值?
您可能希望在具有必须运行的任务的实例中更改它们,而不管是否关闭。
如果只使用Executors静态方法创建ScheduledExecutorService的实例,你应该如何更改/配置它们
一般来说,如果要控制这种类型的功能,则必须创建自己的ScheduledThreadPoolExecutor。如果您查看Executors.newScheduledThreadPool
的来源,您可以使用它并从那里处理。
ScheduledThreadPoolExecutor l = new ScheduledThreadPoolExecutor(1);
l.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);