模块  java.base
软件包  java.util.concurrent

Class ScheduledThreadPoolExecutor

  • 实现的所有接口
    ExecutorExecutorServiceScheduledExecutorService

    public class ScheduledThreadPoolExecutorextends ThreadPoolExecutorimplements ScheduledExecutorService
    ThreadPoolExecutor ,可以额外安排命令在给定延迟后运行,或定期执行。 该类优选的是Timer需要多个工作线程时,或当附加灵活性或能力ThreadPoolExecutor需要(这此类扩展)。

    延迟任务在启用后立即执行,但没有任何实时保证,启用它们后何时启动它们。 按照先进先出(FIFO)提交顺序启用计划完全相同执行时间的任务。

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

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

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

    ThreadPoolExecutor ,如果没有另外指定,则此类使用Executors.defaultThreadFactory()作为默认线程工厂,并使用ThreadPoolExecutor.AbortPolicy作为默认拒绝执行处理程序。

    扩展注释:此类重写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 - 池中保留的线程数,即使它们处于空闲状态,除非 allowCoreThreadTimeOutallowCoreThreadTimeOut
        异常
        IllegalArgumentException - 如果 corePoolSize < 0
      • ScheduledThreadPoolExecutor

        public ScheduledThreadPoolExecutor​(int corePoolSize,                                   ThreadFactory threadFactory)
        使用给定的初始参数创建新的 ScheduledThreadPoolExecutor
        参数
        corePoolSize - 池中保留的线程数,即使它们处于空闲状态,除非设置了 allowCoreThreadTimeOut
        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 - 池中保留的线程数,即使它们处于空闲状态,除非 allowCoreThreadTimeOutallowCoreThreadTimeOut
        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)
        提交定期操作,该操作在给定的初始延迟后首先启用,随后在给定的时间段内启用; 也就是说,执行将在initialDelay之后开始,然后是initialDelay + period ,然后是initialDelay + 2 * period ,依此类推。

        任务执行的顺序将无限期地继续,直到发生以下异常完成之一:

        后续执行被禁止。 对返回的未来的后续调用isDone()将返回true

        如果此任务的执行时间超过其周期,则后续执行可能会延迟,但不会同时执行。

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

        public ScheduledFuture<?> scheduleWithFixedDelay​(Runnable command,                                                 long initialDelay,                                                 long delay,                                                 TimeUnit unit)
        提交在给定的初始延迟之后首先启用的定期动作,并且随后在一次执行的终止和下一次执行的开始之间给定延迟。

        任务执行的顺序将无限期地继续,直到发生以下异常完成之一:

        后续执行被禁止。 对返回的未来的后续电话isDone()将返回true
        Specified by:
        scheduleWithFixedDelay在界面 ScheduledExecutorService
        参数
        command - 要执行的任务
        initialDelay - 延迟首次执行的时间
        delay - 一次执行终止与下一次执行开始之间的延迟
        unit - initialDelay和delay参数的时间单位
        结果
        ScheduledFuture表示一系列重复任务的待完成。 未来的get()方法永远不会正常返回,并且会在任务取消或任务执行异常终止时抛出异常。
        异常
        RejectedExecutionException - 如果无法安排任务执行
        NullPointerException - 如果命令或单位为空
        IllegalArgumentException - 如果延迟小于或等于零
      • submit

        public <T> Future<T> submit​(Callable<T> task)
        从界面复制的说明: ExecutorService
        提交值返回任务以执行并返回表示任务的挂起结果的Future。 Future的get方法将在成功完成后返回任务的结果。

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

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

        Specified by:
        submit在界面 ExecutorService
        重写:
        submitAbstractExecutorService
        参数类型
        T - 任务结果的类型
        参数
        task - 要提交的任务
        结果
        表示未完成任务的Future
        异常
        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 if将在关机后执行
        另请参见:
        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 ,则会取消现有延迟尚未false的延迟任务。 除非ContinueExistingPeriodicTasksAfterShutdownPolicy已设置为true ,否则将取消现有周期性任务的后续执行。

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

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

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

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

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

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

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

        保证对此队列的迭代按其执行顺序遍历任务。

        重写:
        getQueueThreadPoolExecutor
        结果
        任务队列