Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadPoolExecutor是否没有预定义的饱和策略?_Java_Threadpoolexecutor - Fatal编程技术网

Java ThreadPoolExecutor是否没有预定义的饱和策略?

Java ThreadPoolExecutor是否没有预定义的饱和策略?,java,threadpoolexecutor,Java,Threadpoolexecutor,我正在实践中阅读Java并发,对ThreadPoolExecutor的声明感到困惑,如下所示: 工作时,没有预定义的饱和策略使执行阻塞 队列已满 但是,作者也将中止作为默认策略 那么这里出了什么问题?如java文档中所述: 在以下情况下,在方法execute(Runnable)中提交的新任务将被拒绝: 执行器已关闭,并且在执行器使用 最大线程和工作队列容量的有限界限,和为 饱和。在任何一种情况下,execute方法都会调用 RejectedExecutionHandler.rejectedExe

我正在实践中阅读Java并发,对ThreadPoolExecutor的声明感到困惑,如下所示:

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

但是,作者也将
中止
作为默认策略


那么这里出了什么问题?

如java文档中所述:

在以下情况下,在方法execute(Runnable)中提交的新任务将被拒绝: 执行器已关闭,并且在执行器使用 最大线程和工作队列容量的有限界限,和为 饱和。在任何一种情况下,execute方法都会调用 RejectedExecutionHandler.rejectedExecution(可运行, 其RejectedExecutionHandler的ThreadPoolExecutor)方法

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

  • 在默认ThreadPoolExecutor.AbortPolicy中,处理程序在拒绝时抛出runtime RejectedExecutionException
  • 在ThreadPoolExecutor.CallerRunPolicy中,调用自身执行的线程运行任务。这提供了一种简单的反馈控制机制,可以降低提交新任务的速度
  • 在ThreadPoolExecutor.DiscardPolicy中,无法执行的任务被简单地丢弃
  • 在ThreadPoolExecutor.DiscardOldestPolicy中,如果执行器未关闭,则丢弃工作队列头部的任务,然后重试执行(这可能再次失败,导致重复执行)
  • 因此,默认情况下使用abortpolicy

    可以定义和使用其他类型的 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);
    }
    
    /**
    *默认被拒绝的执行处理程序
    */
    私有静态最终拒绝执行处理程序defaultHandler=
    新的反堕胎政策();
    公共线程池执行器(int corePoolSize,
    int maximumPoolSize,
    长时间,
    时间单位,
    阻塞队列(工作队列){
    这(corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、,
    Executors.defaultThreadFactory(),defaultHandler);
    }
    公共线程池执行器(int corePoolSize,
    int maximumPoolSize,
    长时间,
    时间单位,
    阻塞队列工作队列,
    螺纹工厂(螺纹工厂){
    这(corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、,
    threadFactory,defaultHandler);
    }
    

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

    为了与问题中的引用相关,四个预定义策略都不会阻止调用者。