`
zzhonghe
  • 浏览: 243328 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ThreadPoolExecutor线程池实现逻辑

    博客分类:
  • Java
阅读更多
之前不知道是看了哪篇文章,形成了一个概念,说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队列里面的任务。
分享到:
评论
1 楼 hooray520 2011-07-25  
nice~~

相关推荐

Global site tag (gtag.js) - Google Analytics