ScheduledThreadPoolExecutor + setXXXXShutdownPolicy()

时间:2010-10-08 19:15:49

标签: java concurrency

ScheduledThreadPoolExecutor中有以下getter(以及随附的setter)有两个属性:

boolean getContinueExistingPeriodicTasksAfterShutdownPolicy()
     

获取有关是否继续执行现有定期任务的策略,即使此执行程序已关闭。在这种情况下,这些任务仅在shutdownNow时或在已经关闭时将策略设置为false后终止。默认情况下,此值为false。

boolean getExecuteExistingDelayedTasksAfterShutdownPolicy()
     

获取有关是否执行现有延迟任务的策略,即使此执行程序已关闭也是如此。在这种情况下,这些任务仅在shutdownNow时终止,或者在已经关闭时将策略设置为false后终止。默认情况下,此值为true。

为什么它们有不同的默认值,是否有理由更改这些属性的值?

另外,如果您只是使用Executors静态方法创建ScheduledExecutorService的实例(没有调整上述属性的方法),您应该如何更改/配置它们? / p>

1 个答案:

答案 0 :(得分:2)

第一:

getContinueExistingPeriodicTasksAfterShutdownPolicy()

如果返回false,则当您关闭执行程序时,执行程序将取消/禁止所有定期任务。运行定期任务时,执行程序可以允许它们完成。将此设置为true将告诉执行程序允许所有正在运行的周期性任务完成。

第二

getExecuteExistingDelayedTasksAfterShutdownPolicy()

有些任务以初始延迟运行但不是定期运行。这确定执行程序服务是否应在关闭时取消那些非句点任务(默认为true)。

请注意,期间任务是使用scheduleAtFixedRate计划的任务,而使用scheduleWithFixedDelay计划非周期性任务。

  

为什么它们有不同的默认值,是否有理由更改这些属性的值?

您可能希望在具有必须运行的任务的实例中更改它们,而不管是否关闭。

  

如果只使用Executors静态方法创建ScheduledExecutorService的实例,你应该如何更改/配置它们

一般来说,如果要控制这种类型的功能,则必须创建自己的ScheduledThreadPoolExecutor。如果您查看Executors.newScheduledThreadPool的来源,您可以使用它并从那里处理。

    ScheduledThreadPoolExecutor l = new ScheduledThreadPoolExecutor(1);
    l.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);