线程池介绍(状态-结构-流程)

线程池参数

在这里插入图片描述1) corePoolSize:核心线程数
2) maximumPoolSize:最大线程数
3) keepAliveTime:线程池中线程所允许的空闲时间
4) unit:keepAliveTime的时间单位
5) workQueue:用来保存等待执行的任务的阻塞队列的个数
6) threadFactory:用于创建线程的线程工厂
7) handler:线程池的饱和处理机制,当阻塞队列已经满了,且没有空闲的线程,提交的任务的处理机制

线程池状态

1) RUNNING(高3位位:111):表示线程池是运行的状态,可以接收新的任务及对线程池中已存在的任务的处理;
2) SHUTDOWN(高3位位:000):在此状态时,线程池不接收新的任务,但对线程池已存在的任务会进行处理;
3) STOP(高3位位:001):表示线程池既不接收新的任务,不处理阻塞队列的任务,并中断正在运行的任务;
4) TIDYING(高3位位:010):表示所有的任务已中止,线程池中记录的任务数为0;
5) TERMINATED(高3位位:011):表示线程池已中止
在这里插入图片描述
线程池的线程数量和线程的状态是通过一个int类型的32位来标记其中低29位来表示线程的数量,高3位来表示线程的状态
在这里插入图片描述

线程池结果及流程

在这里插入图片描述线程池的流程:
1) 当有Runnable任务过来的时候首先判断当前线程池的活动线程数是否小于核心线程corePoolSize
在这里插入图片描述若小于核心线程数,则创建核心线程并将任务加到此线程中;
AddWorker方法:
在这里插入图片描述首先判断线程池状态如果非运行状态并且如果添加进来的任务为空且队列中任务为空,则不需要创建线程了;
然后尝试增加线程数量如果成功,跳出循环往下执行,若失败,再循环尝试增加线程数量;
上面执行成功后就执行创建Worker线程并执行
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
可以看到worker类继承了AQS,使用AQS来实现独占锁的功能,实现了Runnable接口,在上面创建worker时,其实就是调用线程工厂创建线程,且在run方法中执行的就是其this对象。后续代码大家可以继续链接进去查看后面的实现流程

2) 若当前活动数不小于核心线程数,则将新过来的任务添加到阻塞队列中,并创建非核心线程,添加的非核心线程第一次是没有任务的。
在这里插入图片描述3) 若阻塞队列中的任务已经满了,且当前线程池中的核心线程+非核心线程都在运行,那触发了饱和任务的处理机制

在这里插入图片描述• AbortPolicy:直接向外抛异常

在这里插入图片描述
• CallerRunsPolicy:使用调用此任务的线程执行

在这里插入图片描述• DiscardOldestPolicy:是将阻塞队列中的第一个等待任务移除,然后将此任务加到阻塞队列中
在这里插入图片描述• DiscardPolicy:空跑方法,未做任何处理
在这里插入图片描述
在这里插入图片描述

可以看到上面四种处理机制都是实现的RejectedExecutionHandler接口,我们也可以自定义处理机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值