概述
线程池参数
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接口,我们也可以自定义处理机制。
最后
以上就是体贴墨镜为你收集整理的线程池介绍(状态-结构-流程)线程池参数线程池状态线程池结果及流程的全部内容,希望文章能够帮你解决线程池介绍(状态-结构-流程)线程池参数线程池状态线程池结果及流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复