java线程池在平时的开发中应用的很广,也会经常被人问到,今日我发现以前自己学习到的线程池的知识有些出入,所以特意的整理一下
线程池构造方法中的参数我就不一一介绍了,这篇文章的主要目的是分析这些参数在运行期间的作用
我们可以把线程池的结构想向成三个部分:1.核心线程池 2.缓存队列 3.非核心线程池
我们想像这样一个场景,一间屋子里有成“吕”字型上下摆放的两个暖气片中间用一根管子链接,从下向上注入热水,当下边的暖气片注满谁后水压会将热水顶到管子里,当超过管子的长度时进入上面的暖气片(方便形象化的记忆,我瞎想出来的)。
下面的暖气片就是核心线程池,中间的管子就是缓存队列,上面的暖气片就是非核心线程池;
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
corePoolSize:下边的暖气片的容量
maximumPoolSize:上下两个暖气片的容量
workQueue:中间的管子
以上纯属本人瞎编如有误人子弟之娴,不胜荣幸
构建完成线程池后,放入第一个任务线程池会检查核心线程数量,如果当前线程数量小于核心线程池大小,就直接新建一个核心线程放到池里,如果当前线程池大小大于核心线程池大小,将任务放进队列里,如果队列放不下了检查一下当前线程池大小是否等于最大线程池大小,如果不大于新建一个非核心线程,如果大于执行拒绝策略。
还有一点要知道当任务放入到了队列中,当核心线程池处理完他的任务时会从队列中获取任务进行处理
是不是忘记了什么?
keepAliveTime,unit我实在是没法用暖气片理论解释,直白一点的说吧,这个时间就是非核心线程的存活时间