ThreadPoolExecutor线程池实现逻辑

之前不知道是看了哪篇文章,形成了一个概念,说ThreadPoolExecutor的线程超时回收机制,是采用的DeplyQueue,我觉得非常惊讶,DeplyQueue虽然说是超时的能够取出回收,但是那些没有超时的对象,是怎么也取不出来的啊,带着这个问题,我详细阅读了一下这部分的源代码,发现其实现和DelayQueue一点关系也没有,也算是解决了我的一个疑问。

该线程池的实现,主要有两个容器,一个放任务,一个放线程,然后其他一堆参数,都围绕这2个容器进行设置。


BlockingQueue:  这是一个任务(Runnable)队列。每次提交上来的任务,如果不是能立刻执行的话,都会存到这个队列里面。


HashSet: 这个是一个Thread的容器,容器里面的Thread会一刻不停的从BlockingQueue里面take任务,直到BlockingQueue的所有任务都清掉了,这些Thread还是不停地take,这个时候当然take不到任何东西,从而被阻塞起来。阻塞了一段可配置的时间(keepAliveTime)后,线程就会被清掉。


对于HashSet的容量,可以设置一个正常值(corePoolSize),
当HashSet里面的Thread数量小于这个值的时候,新进来的任务就不进入到BlockingQueue队列了,立刻被新创建的线程执行,同时这个新的线程加入到了HashSet里面。 
当HashSet里面的数量大于这个正常值的时候,新任务就加到队列里面,等待被take出去然后执行。

HashSet的容量可以设置一个最大值(maxPoolSize),当队列满了的时候,仍然有很多任务进来,这时如果HashSet还没有达到最大值,就又能创建新的Thread来处理这些任务,处理完后线程被加入到HashSet中,继续开始take队列里面的任务。

你可能感兴趣的:(多线程,thread)