ThreadPoolExecutor详解(不看后悔,一看必懂)

版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/qq_36071795/article/details/83932415

构造器参数分析

第四个构造器源码

corePoolSize:核心池的大小

默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数数目少于corePoolSize时,有新任务进来就新建一个线程,即使有的线程没事干,当线程池中的线程数目达到corePoolSize时,将到达的任务放在缓存队列中

可以理解为:队列没满时,线程最大并发数

maximumPoolSize:线程池最多线程数

表示在线程池中最多能创建多少个线程

可以理解为:队列满后,线程能够达到的最大并发数

keepAliveTime:空闲线程过多久被回收的时间限制

默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize

unit:keepAliveTime的时间单位

workQueue:阻塞队列,用来存放待执行的任务

SynchronousQueue(不存储任务,直接提交队列,也是无界)

工作队列的默认选项是 SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。

ArrayBlockingQueue(有界队列,基于数组,先进先出)

LinkedBlockingQueue(无界队列,基于链表,先进先出)

threadFactory:线程工厂,用来创建新线程

handler:饱和策略

当队列和线程池都满了(也就是说超过了maximumPoolSiz和workQueue),说明线程池处于饱和状态,那么必须采用一种策略来处理新任务

当然也可以根据具体场景需要实现RejectedExecutionHandler接口来自定义策略,如记录日志或持久化不能处理的任务

构造器的使用

newSingleThreadExecutor-->单线程线程池

newFixedThreadExecutor(n)-->固定数量线程池

newCacheThreadExecutor(推荐使用)-->缓存线程池

newScheduleThreadExecutor

大小无限制的线程池,支持定时和周期性的执行线程

常用方法之向线程池提交任务

提交不需要返回值的任务

提交需要返回值的任务

常用方法之关闭线程池

猜你喜欢

转载自blog.csdn.net/qq_36071795/article/details/83932415
今日推荐