Module  java.base
软件包  java.util.concurrent

Class ScheduledThreadPoolExecutor

  • All Implemented Interfaces:
    ExecutorExecutorServiceScheduledExecutorService


    public class ScheduledThreadPoolExecutor
    extends ThreadPoolExecutor
    implements ScheduledExecutorService
    A ThreadPoolExecutor ,其可以另外调度在给定延迟之后运行的命令,或者周期性地执行。 该类优选的是Timer需要多个工作线程时,或当附加灵活性或能力ThreadPoolExecutor需要(这此类扩展)。

    延迟任务执行时间早于启用,但没有任何实时保证,在启用后,他们将开始。 计划执行完全相同执行时间的任务将以先进先出(FIFO)的提交顺序启用。

    提交的任务在运行之前被取消,执行被抑制。 默认情况下,这样一个取消的任务在工作队列中不会自动删除,直到其延迟过去。 虽然这样可以进一步检查和监控,但也可能导致取消任务的无限制保留。 为避免这种情况,请使用setRemoveOnCancelPolicy(boolean)在取消时立即从工作队列中删除任务。

    通过scheduleAtFixedRatescheduleWithFixedDelay安排的定期任务的连续执行不重叠。 虽然不同的执行可以通过不同的线程来执行,先前执行的效果happen-before那些随后的那些的。

    虽然这个类继承自ThreadPoolExecutor ,但是一些继承的调优方法对它是没有用的。 特别是因为它作为使用corePoolSize线程和无限队列的固定大小的池,对maximumPoolSize调整没有任何有用的效果。 另外,将corePoolSize设置为零或使用allowCoreThreadTimeOut几乎是一个好主意,因为这可能会使池没有线程来处理任务,只要它们有资格运行。

    扩展笔记:此类覆盖了executesubmit方法,以生成内部ScheduledFuture对象来控制每个任务的延迟和调度。 为了保护功能,子类中这些方法的任何进一步覆盖都必须调用超类版本,这有效地禁用其他任务自定义。 然而,此类提供替代保护扩展方法decorateTask (每一个用于一个版本RunnableCallable ),其可以被用于定制用于执行经由输入的命令的具体任务类型executesubmitschedulescheduleAtFixedRate ,和scheduleWithFixedDelay 默认情况下, ScheduledThreadPoolExecutor使用扩展FutureTask的任务类型。 但是,可以使用以下形式的子类修改或替换:

       public class CustomScheduledExecutor extends ScheduledThreadPoolExecutor { static class CustomTask<V> implements RunnableScheduledFuture<V> { ... } protected <V> RunnableScheduledFuture<V> decorateTask( Runnable r, RunnableScheduledFuture<V> task) { return new CustomTask<V>(r, task); } protected <V> RunnableScheduledFuture<V> decorateTask( Callable<V> c, RunnableScheduledFuture<V> task) { return new CustomTask<V>(c, task); } // ... add constructors, etc. } 
    从以下版本开始:
    1.5
    • 构造方法详细信息

      • ScheduledThreadPoolExecutor

        public ScheduledThreadPoolExecutor​(int corePoolSize)
        创建一个新的 ScheduledThreadPoolExecutor与给定的核心池大小。
        参数
        corePoolSize - 即使空闲时仍保留在池中的线程数,除非设置了 allowCoreThreadTimeOut
        异常
        IllegalArgumentException - 如果是 corePoolSize < 0
      • ScheduledThreadPoolExecutor

        public ScheduledThreadPoolExecutor​(int corePoolSize,
                                           ThreadFactory threadFactory)
        使用给定的初始参数创建一个新的 ScheduledThreadPoolExecutor
        参数
        corePoolSize - 即使空闲时仍保留在池中的线程数,除非 allowCoreThreadTimeOutallowCoreThreadTimeOut
        threadFactory - 执行程序创建新线程时使用的工厂
        异常
        IllegalArgumentException - 如果是 corePoolSize < 0
        NullPointerException - 如果 threadFactory为空
      • ScheduledThreadPoolExecutor

        public ScheduledThreadPoolExecutor​(int corePoolSize,
                                           RejectedExecutionHandler handler)
        用给定的初始参数创建一个新的 ScheduledThreadPoolExecutor
        参数
        corePoolSize - 即使空闲时仍保留在池中的线程数,除非 allowCoreThreadTimeOutallowCoreThreadTimeOut
        handler - 执行被阻止时使用的处理程序,因为达到线程限制和队列容量
        异常
        IllegalArgumentException - 如果是 corePoolSize < 0
        NullPointerException - 如果 handler为空
      • ScheduledThreadPoolExecutor

        public ScheduledThreadPoolExecutor​(int corePoolSize,
                                           ThreadFactory threadFactory,
                                           RejectedExecutionHandler handler)
        用给定的初始参数创建一个新的 ScheduledThreadPoolExecutor
        参数
        corePoolSize - 要保留在池中的线程数,即使它们处于空闲状态,除非设置了 allowCoreThreadTimeOut
        threadFactory - 当执行者创建新线程时使用的工厂
        handler - 执行被阻止时使用的处理程序,因为达到线程限制和队列容量
        异常
        IllegalArgumentException - 如果是 corePoolSize < 0
        NullPointerException - 如果 threadFactoryhandler为空
    • 方法详细信息

      • decorateTask

        protected <V> RunnableScheduledFuture<V> decorateTask​(Runnable runnable,
                                                              RunnableScheduledFuture<V> task)
        修改或替换用于执行runnable的任务。 此方法可用于覆盖用于管理内部任务的具体类。 默认实现只是返回给定的任务。
        参数类型
        V - 任务结果的类型
        参数
        runnable - 提交的Runnable
        task - 创建的执行runnable的任务
        结果
        一个可以执行runnable的任务
        从以下版本开始:
        1.6
      • decorateTask

        protected <V> RunnableScheduledFuture<V> decorateTask​(Callable<V> callable,
                                                              RunnableScheduledFuture<V> task)
        修改或替换用于执行可调用的任务。 此方法可用于覆盖用于管理内部任务的具体类。 默认实现只是返回给定的任务。
        参数类型
        V - 任务结果的类型
        参数
        callable - 提交的Callable
        task - 创建用于执行可调用的任务
        结果
        一个可以执行可调用的任务
        从以下版本开始:
        1.6
      • scheduleAtFixedRate

        public ScheduledFuture<?> scheduleAtFixedRate​(Runnable command,
                                                      long initialDelay,
                                                      long period,
                                                      TimeUnit unit)
        说明从界面ScheduledExecutorService复制
        创建并执行在给定的初始延迟之后,随后以给定的时间段首先启用的周期性动作; 也就是说,执行将在initialDelay之后开始,然后是initialDelay + period ,然后是initialDelay + 2 * period ,等等。

        任务执行的顺序无限期延续,直到出现以下异常完成之一:

        • 任务是通过返回的未来是explicitly cancelled
        • 执行者终止,也导致任务取消。
        • 执行任务会引发异常。 在这种情况下,呼叫get将返回未来将抛出ExecutionException
        后续执行被抑制。 后续的电话isDone()返回未来将返回true

        如果任务执行时间比其周期长,则后续执行可能会迟到,但不会同时执行。

        Specified by:
        scheduleAtFixedRate在接口 ScheduledExecutorService
        参数
        command - 执行任务
        initialDelay - 延迟第一次执行的时间
        period - 连续执行之间的时期
        unit - initialDelay和period参数的时间单位
        结果
        一个ScheduledFuture表示一系列重复任务的等待完成。 未来的get()方法将永远不会正常返回,并且在任务取消或任务执行异常终止时将抛出异常。
        异常
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - if命令为空
        IllegalArgumentException - 如果周期小于或等于零
      • scheduleWithFixedDelay

        public ScheduledFuture<?> scheduleWithFixedDelay​(Runnable command,
                                                         long initialDelay,
                                                         long delay,
                                                         TimeUnit unit)
        说明从界面ScheduledExecutorService复制
        创建并执行在给定的初始延迟之后首先启用的定期动作,随后在一个执行的终止和下一个执行的开始之间给定的延迟。

        任务执行的顺序无限期延续,直到出现以下异常完成之一:

        • 任务是通过返回的未来explicitly cancelled
        • 执行者终止,也导致任务取消。
        • 执行任务会引发异常。 在这种情况下,呼叫get将返回未来将会抛出ExecutionException
        后续执行被抑制。 后续调用isDone()对返回的未来将返回true
        Specified by:
        scheduleWithFixedDelay在接口 ScheduledExecutorService
        参数
        command - 要执行的任务
        initialDelay - 延迟第一次执行的时间
        delay - 一个执行终止和下一个执行的开始之间的延迟
        unit - initialDelay和delay参数的时间单位
        结果
        一个ScheduledFuture表示一系列重复任务的等待完成。 未来的get()方法将永远不会正常返回,并且在任务取消或异常终止任务执行时将抛出异常。
        异常
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - if命令为空
        IllegalArgumentException - 如果延迟小于或等于零
      • submit

        public <T> Future<T> submit​(Callable<T> task)
        描述从接口ExecutorService复制
        提交值返回任务以执行,并返回代表任务待处理结果的Future。 未来的get方法将在成功完成后返回任务的结果。

        如果您想立即阻止等待任务,您可以使用result = exec.submit(aCallable).get();表单的result = exec.submit(aCallable).get();

        注意: Executors类包括一组可以将其他常见的类似闭包的对象(例如PrivilegedAction)转换Callable表单的方法,以便它们可以提交。

        Specified by:
        submit在接口 ExecutorService
        重写:
        submitAbstractExecutorService
        参数类型
        T - 任务结果的类型
        参数
        task - 提交的任务
        结果
        一个未来的代表,待完成任务
        异常
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果任务为空
      • setContinueExistingPeriodicTasksAfterShutdownPolicy

        public void setContinueExistingPeriodicTasksAfterShutdownPolicy​(boolean value)
        设置关于是否继续执行现有定期任务的策略,即使该执行者已经是shutdown 在这种情况下,这些任务将仅在终止shutdownNow或策略设置后false时已关机。 此值默认为false
        参数
        value - 如果 true ,关机后继续,否则不要
        另请参见:
        getContinueExistingPeriodicTasksAfterShutdownPolicy()
      • getContinueExistingPeriodicTasksAfterShutdownPolicy

        public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy​()
        获得关于是否继续执行现有定期任务的策略,即使该执行者已经是shutdown 在这种情况下,这些任务将仅在终止shutdownNow或策略设置后false时已关机。 此值默认为false
        结果
        true如果将在关机后继续
        另请参见:
        setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean)
      • setExecuteExistingDelayedTasksAfterShutdownPolicy

        public void setExecuteExistingDelayedTasksAfterShutdownPolicy​(boolean value)
        设置关于是否执行现有延迟任务的策略,即使该执行者已经是shutdown 在这种情况下,这些任务只能在shutdownNow终止,或者在已经关闭后将策略设置为false后终止。 此值默认为true
        参数
        value - 如果是 true ,在关机后执行,否则不要
        另请参见:
        getExecuteExistingDelayedTasksAfterShutdownPolicy()
      • getExecuteExistingDelayedTasksAfterShutdownPolicy

        public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy​()
        获取关于是否执行现有延迟任务的策略,即使这个执行者已经是shutdown 在这种情况下,这些任务只能在shutdownNow终止,或者在已经关闭后将策略设置为false之后。 此值默认为true
        结果
        true如果在关机后执行
        另请参见:
        setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean)
      • setRemoveOnCancelPolicy

        public void setRemoveOnCancelPolicy​(boolean value)
        设置取消时取消任务是否应立即从工作队列中删除的策略。 此值默认为false
        参数
        value - 如果 true ,取消取消,否则不要
        从以下版本开始:
        1.7
        另请参见:
        getRemoveOnCancelPolicy()
      • getRemoveOnCancelPolicy

        public boolean getRemoveOnCancelPolicy​()
        获取关于在取消时是否应立即将已取消任务从工作队列中删除的策略。 此值默认为false
        结果
        true如果取消的任务立即从队列中删除
        从以下版本开始:
        1.7
        另请参见:
        setRemoveOnCancelPolicy(boolean)
      • shutdown

        public void shutdown​()
        启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有额外的作用。

        此方法不等待以前提交的任务完成执行。 使用awaitTermination来做到这一点。

        如果ExecuteExistingDelayedTasksAfterShutdownPolicy已被设置为false ,则其延迟尚未过去的现有延迟任务将被取消。 除了ContinueExistingPeriodicTasksAfterShutdownPolicy已经设置true ,未来执行的定期任务将被取消。

        Specified by:
        shutdown在接口 ExecutorService
        重写:
        shutdownThreadPoolExecutor
        异常
        SecurityException - 如果安全管理器存在并关闭,则ExecutorService可能会操纵调用者不允许修改的线程,因为不支持2706269494952 ("modifyThread")或安全管理器的checkAccess方法拒绝访问。
      • shutdownNow

        public List<Runnable> shutdownNow​()
        尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。 从此方法返回时,这些任务将从任务队列中排除(删除)。

        此方法不等待主动执行的任务终止。 使用awaitTermination做到这一点。

        除了努力尝试停止处理积极执行任务之外,没有任何保证。 该实现通过Thread.interrupt()中断任务; 任何不能响应中断的任务都可能永远不会终止。

        Specified by:
        shutdownNow在接口 ExecutorService
        重写:
        shutdownNowThreadPoolExecutor
        结果
        从未开始执行的任务列表。 该列表的每个元素都是一个ScheduledFuture 对于通过schedule方法之一提交的任务,该元素将与返回的ScheduledFuture相同。 对于使用execute提交的任务,元素将为零延迟ScheduledFuture
        异常
        SecurityException - 如果安全管理器存在并关闭,则ExecutorService可能会操纵调用者不允许修改的线程,因为它不保留RuntimePermission ("modifyThread")或安全管理器的checkAccess方法拒绝访问。
      • getQueue

        public BlockingQueue<Runnable> getQueue​()
        返回此执行程序使用的任务队列。 访问任务队列主要用于调试和监视。 此队列可能正在使用中。 检索任务队列不会阻止排队的任务执行。

        这个队列的每一个元素都是一个ScheduledFuture 对于通过schedule方法之一提交的任务,该元素将与返回的ScheduledFuture相同。 对于使用execute提交的任务,元素将为零延迟ScheduledFuture

        这个队列的迭代不能按照它们执行的顺序遍历任务。

        重写:
        getQueueThreadPoolExecutor
        结果
        the task queue