ThreadPoolExecutor参数

多线程-线程池的七个核心参数 线程池在日常工作中经常使用并发编程,线程池是必不可少的。 阅读详情

ThreadPoolExecutor线程池参数设置大多是参考别人的,只是在这里记录下

在ThreadPoolExecutor类中有四个不同参数的构造函数去获取线程池对象

最多7个参数,下面就来介绍下这7个参数的意义以及设置

首先看下参数意义:(这是源码对应的构造函数以及参数)

 /**
     * Creates a new {@code ThreadPoolExecutor} with the given initial
     * parameters.
     *
     * @param corePoolSize the number of threads to keep in the pool, even
     *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
        1.corePoolSize:要保留在池中的线​​程数,即使它们处于空闲状态,除非设置了
        allowCoreThreadTimeOut
        * 核心线程会一直存活,及时没有任务需要执行
        * 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理
        * 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

     * @param maximumPoolSize the maximum number of threads to allow in the
     *        pool
        2.maximumPoolSize:池中允许的最大线程数
        * 当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务
        * 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常

     * @param keepAliveTime when the number of threads is greater than
     *        the core, this is the maximum time that excess idle threads
     *        will wait for new tasks before terminating.
        3.keepAliveTime:当线程数大于核心数时,这是多余的空闲线程在终止前等待新
        任务的最长时间。
        * 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
        * 如果allowCoreThreadTimeout=true,则会直到线程数量=0

     * @param unit the time unit for the {@code keepAliveTime} argument
        4.unit(TimeUnit):{@code keepAliveTime} 参数的时间单位
        *设置参数3的单位时分秒天等单位

     * @param workQueue the queue to use for holding tasks before they are
     *        executed.  This queue will hold only the {@code Runnable}
     *        tasks submitted by the {@code execute} method.
        5.workQueue:用于在执行任务之前保存任务的队列。该队列将仅保存由 
        {@code execute} 方法提交的 {@code Runnable} 任务

     * @param threadFactory the factory to use when the executor
     *        creates a new thread
        6.threadFactory:执行程序创建新线程时使用的工厂        

     * @param handler the handler to use when execution is blocked
     *        because the thread bounds and queue capacities are reached
        7.handler:由于达到线程边界和队列容量而阻塞执行时要使用的处理程序

     * @throws IllegalArgumentException if one of the following holds:<br>
     *         {@code corePoolSize < 0}<br>
     *         {@code keepAliveTime < 0}<br>
     *         {@code maximumPoolSize <= 0}<br>
     *         {@code maximumPoolSize < corePoolSize}
     * @throws NullPointerException if {@code workQueue}
     *         or {@code threadFactory} or {@code handler} is null
     */
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
}

  详细解说下workQueue(BlockingQueue<Runnable> 的创建):

ArrayBlockingQueue
先进先出,阻塞队列,插入元素时队列满了会一直等待。新元素插入到队列的尾部,
队列获取操作则是从队列头部开始获得元素。

SynchronousQueue
数组结构的阻塞队列。队列满了以后,任何一次插入操作的元素都要等待相对的删除/读取操作。

LinkedBlockingQueue
先进先出,链表结构非阻塞队列,适合插入和删除较多的操作。

DelayedWorkQueue
延迟队列,延迟的时间还未到的获取的任务会返回空。

PriorityBlockingQueue
优先级队列,元素必须实现Comparable接口,优先级最高的始终在队列的头部,任务会优先执行。

 详细说下handler(RejectedExecutionHandler的创建),以下都是队列满了以后,新任务的处理方式,也可以自己实现RejectedExecutionHandler去自定义。

1.AbortPolicy
如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常,源码如下:
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    throw new RejectedExecutionException("Task " + r.toString() + 
 " rejected from " +  e.toString());
}

2.DiscardPolicy
队列满了任务直接丢掉,什么也不错。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}

3.DiscardOldestPolicy
队列满了以后,移除掉头部的元素,再尝试加入新元素。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    if (!e.isShutdown()) {
        e.getQueue().poll();
        e.execute(r);
    }
}

4.CallerRunsPolicy
队列满了以后,主线程自己去运行。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    if (!e.isShutdown()) {
        r.run();
    }
}

 下面说下ThreadPoolExecutor执行顺序

 线程池按以下行为执行任务
    1. 当线程数小于核心线程数时,创建线程。
    2. 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
    3. 当线程数大于等于核心线程数,且任务队列已满
        - 若线程数小于最大线程数,创建线程
        - 若线程数等于最大线程数,抛出异常,拒绝任务

ThreadPoolExecutor参数图解,可以参考下面链接,详细介绍了各个参数,

链接:https://blog.youkuaiyun.com/u011916937/article/details/107041519

微机原理-基于8086电压报警2.5V仿真系统设计 *单片机设计介绍,微机原理-基于8086电压报警2.5V仿真系统设计。 阅读详情

相关推荐

开源 AHB不对称半桥反激电路设计(六)死区时间,谐振腔电流,谐振电感函数表达式

电流跌落可以使副边电流峰值和有效值降低,减小损耗,但如果开关管 S2 导通期间,谐振电流谐等于励磁电流,即副边电流A 点降至 0,会在原边变压器内形成环流,产生损耗,同时也不利于副边同步整流管驱动的正常工作,为了保证开关管 S2 导通期。在开关管 S1 和开关管 S2 均关断的死区时间内,谐振电流给原边开关管结电容和副边整流管结电容充放电,因此会引起开关 S1 关断瞬间电流跌落与开关 S2 关断瞬间电流震荡现象,受寄生参数影响原边谐振电流波形和副边电流波形如图。降到最低,变压器以最高效率向副边传递能量。

【Simon】的博客 1230

多线程---线程池核心参数

常用参数总结: 关于Java线程池的参数设置: 线程池是Java多线程里开发里的重要内容,使用难度不大,但如何用好就要明白参数的含义和如何去设置。干货里的内容大多是参考别人的,加入了一些知识点的扩充和看法。希望能对多线程开发学习的童鞋有些启发和帮助。 构造方法详细信息 ThreadPoolExecutor public ThreadPoolExecutor(intcoreP...

oDianZi1234567的博客 5885

[比赛]新冠期间饿了么骑士行为预估-数据理解

写在前面 饿了么的比赛的赛题数据理解。 一、骑士行为数据 courier_id 骑士id wave_index 波次index tracking_id 订单id courier_wave_start_lng 波次起始时刻骑士位置 courier_wave_...

Helslie的博客 2944

ThreadPoolExecutor参数说明

一、ThreadPoolExecutor的重要参数 1、corePoolSize:核心线程数 * 核心线程会一直存活,及时没有任务需要执行 * 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 * 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 2、queueCapacity:任务队列容量(阻塞队列) * 当核心线程数达到最大时,新任务会放在队列中排

sinat_15946141的博客 3万+

实战对比:VINS和ORBSLAM3在无人机避障中的表现(含实测数据)

本文通过实战测试,深度对比了VINS和ORBSLAM3两种主流视觉SLAM算法在无人机避障中的表现。测试聚焦于光照变化、动态遮挡和快速运动三大挑战,提供了详细的实测数据与性能分析。结果表明,VINS在计算效率和实时性上占优,而ORBSLAM3在定位精度和地图管理方面更稳健,为不同应用场景下的工程选型提供了清晰依据。

醉三国 628

【机械视觉】Halcon—【二、Halcon算子全面介绍(超详细版)】

Halcon 的算子(operators)按照功能被系统性地划分为多个类别,官方文档中目前(Halcon 22.11 版本)共有 19 个主分类,每个主分类下还有若干子分类。 本人在此对这19个分类的常用核心算子进行了一系列的总结,且本人在文章最后还总结了一些案例经验。 注意: ​​​​​​​跨分类调用:某些算子可能在多个分类中,但官方文档中会明确其主分类。 例如: read_image(文件操作)常被其他分类(如图像处理)的示例调用,但其核心功能是文件读取。

qq_3517289697的博客 3920

多线程中线程池常见7个参数的详解以及执行流程

一 线程池常见参数 1.1 概念 1.2 coresize和maxsize,poolsize 1.corePoolSize: 线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。 2.maximumPoolSize: 线程池中允许的最大线程数 3.poolSize: 线程池中当前线程的数量 3者之间的关系: 新提交一个任务时的处理流程很明显: 1、如果当前线程池的线程数还没有达到基本大小(poolSize ..

健康平安的活着的专栏 7329

Veritas NetBackup8.1.1安装

1.在服务器上运行Browser.exe 2.选中安装,点击"NetBackup Server Software Installation" 3.提示一个”UAC模式”,我们确定忽略它 4.下一步 5.接受授权,下一步 6.自定义安装 7.输入Key,并点击”netBackup Master Server” 8.自定义路径,下一步 9.默认端口,下一步 10.创建内置账户 创建本地用户帐户: C:\>net user nbwebsvc <StrongPassword> /

万物皆可学 2万+

多线程--线程池

核心线程数。:最大线程数。:线程空闲时间。unit:时间单位。workQueue:工作队列。:线程工厂。handler:拒绝策略。

zx733988的博客 1140

windows中通过docker部署LocateAnything-3B模型

windows中通过docker部署LocateAnything-3B模型

yilvyangguang520的博客 485

基于YOLOv11的仓库机器人导航系统设计与实现:Amazon Robotics Challenge解决方案

本文将详细介绍一个基于YOLOv11目标检测算法的仓库机器人导航系统,该系统能够准确识别托盘(pallet)和箱子(box),为机器人提供精确的导航信息。而基于深度学习的视觉导航系统能够实时识别环境中的关键物体,如托盘和箱子,从而实现更智能的路径规划和货物搬运。YOLOv11作为YOLO系列的最新演进版本,在检测精度和速度上都有显著提升,非常适合仓储环境中的实时物体检测任务。YOLOv11在保持实时性的同时,提高了对小物体和密集物体的检测能力,这对仓储环境中的托盘和箱子检测尤为重要。

YOLO 304

ThreadPoolExecutor的重要参数

一、ThreadPoolExecutor的重要参数 1、corePoolSize:核心线程数 * 核心线程会一直存活,及时没有任务需要执行 * 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 * 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 2、...

weixin_34342992的博客 1090

博途PLC PID仿真LSim_PT1库算法(一阶系统差分方程推导全过程)

博途PLC的PID仿真可以参看下面这篇博客,这篇文章我们主要论坛仿真库LSim的算法由来。如何利用博途PLC PID_Compact 进行PID仿真(一阶系统)_RXXW_Dor的博客-优快云博客博途PLC PID控制器 PID_Compact FB如何使用可以参看下面这篇文章,这里不再赘述。

RXXW_Dor的博客 2859

ThreadPoolExecutor 参数详解

1、 ThreadPoolExecutor 数据成员 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); ctl 主要用于存储线程池的工作状态以及池中正在运行的线程数。显然要在一个整型变量存储两个数据,只能将其一分为二。其中高3bit用于存储线程池的状态,低位的29bit用于存储正在运行的线程数。 线程...

猎人在吃肉 2万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ThreadPoolExecutor参数图解

为什么使用ThreadPoolExecutor 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 1:在任务众多的情况下,系统要为每一个任务创建一个线程,而任务执行完毕后会销毁每一个线程,所以会造成线程频繁地创建与销毁。 2:多个线程频繁地创建会占用大量的资源,并且在资源竞争的时候就容易出现问题,同时这么多的线程缺乏一个统一的管理,容易造成界面的卡顿。 3:多个线程频繁地销毁,会频繁地调用GC机制,...

Veer的博客 1705

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ThreadPoolExecutor参数详解

为什么要使用ThreadPoolExecutor? 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这 样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 另外使用Executors直接去创建,允许的请求或创建的队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 参数详解 public ThreadPoolExecutor(int corePoolSize,

黑卡米的专栏 1268

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ThreadPoolExecutor线程池核心参数详解

理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize 我们知道,受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值。也就是说ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程,去执行提交的任务。然而对于多用户、高并发的应用来说,提交的任...

大隐隐于野 3万+

threadpoolexecutor参数_ThreadPoolExecutor的使用

ThreadPoolExecutor也就是线程池。它就是Java为我们开发多线程程序时提供的一个开发框架。它可以统一的管理线程的创建、销毁、优化、监控等,在使用线程池时比我们直接使用原始的线程类更加方便。既然线程池这么方便,那它到底是怎么实现上述的功能呢?下面我们先看一下当用线程池启动一个线程时它的流程图。线程池的处理流程如下:当我们用线程池启动一个任务时,线程池首先会检查核心线程池里面的线程数是...

weixin_39827850的博客 526

ThreadPoolExecutor主要参数?

ThreadPoolExecutor3 个最重要的参数: corePoolSize:核心线程数,线程数定义了最小可以同时运行的线程数量。 maximumPoolSize:线程池中允许存在的工作线程的最大数量 workQueue:当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,任务就会被存放在队列中。 ThreadPoolExecutor其他常见参数: keepAliveTime:线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心...

weixin_43878297的博客 971

ThreadPoolExecutor相关参数

ThreadPoolExecutor相关参数

zlpzlpzyd的专栏 277

ThreadPoolExecutor 的参数含义及源码执行流程

线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。但如果要说线程池的话一定离不开 ThreadPoolExecutor ,在阿里巴巴的《Java 开发手册》中是这样规定线程池的:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的读者更加明确线程池的运行规则,规避资源耗尽的风险。说明:Execu

m0_57042151的博客 1697

ThreadPoolExecutor传递单个参数和多个参数

ThreadPoolExecutor传递单个参数和多个参数

Mr_Richard的博客 1159
上一篇: Tomcat 服务器核⼼配置详解——server.xml
下一篇: CountDownLatch介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值