ThreadPoolExecutor没有预定义的饱和策略吗?

时间:2015-10-22 12:19:47

标签: java threadpoolexecutor

我正在阅读 Java Concurrency in Practice ,并对有关ThreadPoolExecutor的声明感到困惑,如下所示:

  

在工作时没有预定义的饱和策略来执行阻塞   队列已满。

但是,作者还将abort称为默认策略。

所以这里有什么不对?

1 个答案:

答案 0 :(得分:1)

如java doc中所述:

  

方法execute(Runnable)中提交的新任务将被拒绝   Executor已经关闭,Executor也使用了   最大线程和工作队列容量的有限界限,和   饱和即可。在任何一种情况下,execute方法都会调用   RejectedExecutionHandler.rejectedExecution(Runnable接口,   ThreadPoolExecutor)的RejectedExecutionHandler方法。

有4种不同的预定义处理程序:

  1. 在默认的ThreadPoolExecutor.AbortPolicy中,处理程序在拒绝时抛出运行时RejectedExecutionException。
  2. 在ThreadPoolExecutor.CallerRunsPolicy中,调用execute本身的线程运行该任务。这提供了一种简单的反馈控制机制,可以降低新任务的提交速度。
  3. 在ThreadPoolExecutor.DiscardPolicy中,简单地删除了无法执行的任务。
  4. 在ThreadPoolExecutor.DiscardOldestPolicy中,如果执行程序未关闭,则会删除工作队列头部的任务,然后重试执行(可能会再次失败,导致重复执行。)
  5. 因此默认使用AbordPolicy。

      

    可以定义和使用其他类型的   RejectedExecutionHandler类。这样做需要一些小心   特别是当政策被设计为仅在特定情况下工作时   容量或排队政策。

    从ThreadPoolExecutor中提取源代码:

    /**
     * The default rejected execution handler
     */
    private static final RejectedExecutionHandler defaultHandler =
        new AbortPolicy();
    
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
    
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             threadFactory, defaultHandler);
    }
    

    正如@Jiri Tousek所说,所有这些默认行为都会阻止调用者。