假装读懂Java线程池
线程池是干什么的
不用线程池则是一个任务对应一个线程,若采用线程池那么,固定数量线程可以完成超过线程池的任务数。
为什么要用线程池
每个Thread执行的任务时间可长可短可能死循环,我们假设一万个任务需要执行,其中有几个会死循环,那么可以断言,会产生内存泄漏因为线程无法释放。
如果采用线程池,第一可以减少上下文的切换提升效率,第二就算产生泄漏,也能控制损害范围不至于是整个系统崩溃
Jdk是如何实现的
Jdk将任务和线程的角色分离了,任务称为Task是一个Runnable对象(应该是为了无痛切换原有用Thread自己实现的run,不然单独建立一个Task对象会与存量代码产生割裂),完成Task的对象成为Worker,Worker就是实际工作的线程,注意这里的Task可以为任意数目,而Worker只能是有限数目。
具体流程是:
1.用户submit或者execute提交一个Task
2.查找/创建Worker并检查是否有空闲
3.将任务赋予Worker并改变Worker当前状态,增加WorkCount
4.Worker一旦将任务执行完毕且任务队列为空将当前Worker丢弃,并减少WorkCount
5.检查当前线程池是否满足最小启动线程值
6.阻塞在获取Task状态直到下一个任务队列不为空,重复流程2
当然还有其他一些细枝末节的,就不再这个主流程上展示了
为毛不画流程图
大哥。。我只能手绘。。工具不会用