java中ThreadPoolExecutor知识有哪些
创始人
2024-12-21 19:04:24
0次

线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法:

// 七个参数的构造函数public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

这些参数的意义如下:

corePoolSize:该线程池中核心线程数最大值  maximumPoolSize: 该线程池中线程总数最大值  keepAliveTime:该线程池中非核心线程闲置超时时长  unit:keepAliveTime的单位  workQueue:阻塞队列BlockingQueue,维护着等待执行的Runnable对象  threadFactory:创建线程的接口,需要实现他的Thread newThread(Runnable r)方法。  RejectedExecutionHandler:饱和策略,最大线程和工作队列容量且已经饱和时execute方法都将调用RejectedExecutionHandler 。

ThreadPoolExecutor工作流程

流程图如下:

大致过程陈述为:

  1. 向线程池中添加任务,当任务数量少于corePoolSize时,会自动创建thead来处理这些任务;  当添加任务数大于corePoolSize且少于maximmPoolSize时,不在创建线程,而是将这些任务放到阻塞队列中,等待被执行;  接上面2的条件,且当阻塞队列满了之后,继续创建thread,从而加速处理阻塞队列;  当添加任务大于maximmPoolSize时,根据饱和策略决定是否容许继续向线程池中添加任务,默认的饱和策略是AbortPolicy(直接丢弃)。

线程池中使用的阻塞队列

ArrayBlockingQueue:基于数组结构的有界阻塞队列,构造函数一定要传大小,FIFO(先进先出);  LinkedBlockingQueue:无界,默认大小65536(Integer.MAX_VALUE),当大量请求任务时,容易造成内存耗尽。  SynchronousQueue:同步队列,是一个特殊的BlockingQueue,它没有容量(这是因为在SynchronousQueue中,插入将等待另一个线程的删除操作,反之亦然)。  DelayedWorkQueue:这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务

阻塞队列常见的方法如下表所示:

add      增加一个元索      如果队列已满,则抛出一个IIIegaISlabEepeplian异常              remove      移除并返回队列头部的元素      如果队列为空,则抛出一个NoSuchElementException异常              element      返回队列头部的元素      如果队列为空,则抛出一个NoSuchElementException异常              offer      添加一个元素并返回true      如果队列已满,则返回false              poll      移除并返问队列头部的元素      如果队列为空,则返回null              peek      返回队列头部的元素      如果队列为空,则返回null              put      添加一个元素      如果队列满,则阻塞              take      移除并返回队列头部的元素      如果队列为空,则阻塞

常见四种线程池

newCachedThreadPool  newFixedThreadPool  newSingleThreadExecutor  newScheduledThreadPool

CachedThreadPool      SynchronousQueue(队列长度无限      可增加,最大值Integer.MAX_VALUE      默认60秒超时              FixedThreadPool      LinkedBlockingQueue(队列长度无限)      可指定nThreads,固定数量      不会超时              newSingleThreadExecutor      LinkedBlockingQueue(队列长度无限),      固定为1      不超时              newScheduledThreadPool      DelayedWorkQueue      可增加,最大值Integer.MAX_VALUE      不超时

它们通过Executors以静态方法的方式直接调用,实质上是它们最终调用的是ThreadPoolExecutor的构造方法,也就是本文最前面那段代码。

注:KeepAliveTime=0的话,表示不等待

《阿里巴巴java开发手册》中建议线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式,这样的处理方式让写的人员更加明确线程池的运行规则,规避资源耗尽的风险。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: java中ThreadPoolExecutor常识汇总

方法名说明注意
线程池使用的阻塞队列线程池大小超时

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...