前言前端
线程池是Java面试必问问题之一!面试
有没有对源码倒背如流的童鞋?请举手! ♂️(怎么没人举手。。)ide
对了,今天先来撒一波狗狼~函数
(表打我~)工具
来,介绍下:学习
她叫码妞,是我码仔的女友喔!动画
她也在学习各种前端技术,可厉害了!线程
你们鼓掌欢迎吧!之后她会常常来问我问题的,要被烦了~3d
最近码妞也在看Java线程池呢,已经看得一头雾水了,正准备去问问码仔,blog
看码仔能不能给她讲明白了!
线程
线程是一种资源,并非只存在程序的世界里。
程序,原本就是对生活的一种抽象表述。
好比像车站的售票窗口、退票窗口、检票窗口,每一个窗口都在作不一样的事情,就是车站里同时运行着的不一样线程。
线程多了,须要管理,不一样的线程也要能保证不会互相干扰,各作各的。
线程的生命周期
这个图很熟悉的吧~
好,开始讲线程池啦~
ThreadPoolExecutor
线程池源码里最主要的类了~
看下开头的这段注释:
看到英文就头晕?没事啦~
主要讲线程池重要的两个状态:
线程池用一个32位的int来同时保存runState和workerCount,其中高3位(第31到29位)是runState,其他29位是workerCount(大约500 million)。
来看看存储结构(码仔手动画的哦)
它的构造方法
核心线程数,比如班干部的人数。
最大线程数,比如教室里的座位数。 当提交任务数超过了这个最大值,线程还有拒绝策略——RejectExecutionHandler,作不动了嘛。
除核心线程外的空闲线程保持存活时间。 当线程池里线程数超过corePoolSize数量了,keepAliveTime时间到,就把空闲线程关了,否则也闲置了呀,节省能量嘛。
Worker来了!
你看Worker的定义,其实它就是封装了的工做线程~
Worker既实现了Runnable,又继承了AbstractQueuedSynchronizer(AQS),因此它既是一个可执行的任务,又能够达到锁的效果。
看看Worker构造方法:
线程池是怎么工做的?
DuangDuangDuang!
看execute方法里的注释,一步步说得很清楚。
给你流程图!
工具类 Executors
线程池里还有个重要的类:Executors~
Executors是一个Java中的工具类,它提供工厂方法来建立不一样类型的线程池。
用它能够很方便地建立出下面几种线程池来~
或者经过ThreadPoolExecutor的构造函数自定义须要的线程池。