读书人

线程池代码完全辨析(三)

发布时间: 2012-12-27 10:17:10 作者: rapoo

线程池代码完全剖析(三)

线程池代码完全剖析(三)

一、上篇文章剖析了设计线程池的第一条思路,下面分析第二条和第三条思路

?

第二条思路:

?

?关闭的时候新的工作不在接收,中断闲散集合中的线程;停止正在工作任务的线程,设计者主要处理方法时根据时间和循环,来杀死工作的线程

?

五、总结

?

我认为(这个只是我个人的看法)

该停止线程池中的线程工作还是有缺点,如何优雅的关闭线程池中正在工作的线程,主要做的工作:

1、应该要知道有哪些线程正在执行

2、哪些工作的线程需要马上中断

3、哪些工作线程必须要处理完才能中断

4、必须做到这些点式非常必要的。。。。

?

反正里面的设计思想非常值得学习和思考,为什么要这样设计

?

下面有Junit测试代码和源程序,我会上传过来。。。

?

?

1 楼 sebatinsky 2011-03-18 占个位置,先看看,,,, 2 楼 beforezero 2011-03-18 最烦的就是一上来就上代码或配置文件的。多少来点自己的思想啊 3 楼 feidian1028 2011-04-13 /***
* 由于队列是一个由数组组成的循环数组,而_nextJobSlot指针是任务加入
* 队列数组添加时候就++,而_nextJob指针只要从队列数组中取数据的时候
* ++;也就是说当加入任务的数量比取出任务的数量要快队列的数组长度时候,
* 就扩充数组的长度即:_nextJobSlot==_nextJob
*/
if (_nextJobSlot==_nextJob)
{ //扩充任务队列
Runnable[] jobs= new Runnable[_jobs.length+_maxThreads];
int split=_jobs.length-_nextJob;//未增加队列时 队列还有多少个任务
if (split>0)//把队列剩下的任务复制给扩展的队列中
System.arraycopy(_jobs,_nextJob,jobs,0,split);
if (_nextJob!=0)//为什么还要复制呢?不是前面的任务已经执行完,应该没有必要?
我的理解,lz这段代码的理解有问题。
1.因为是循环数组,_nextJobSlot==_nextJob的情况是_nextJobSlot比_nextJob多了一个循环,就像跑步时跑得快的要拉开跑慢的整整一圈时候的情况,通常我们叫套圈。
在这里,表示的意思是整个jobs数据已经都放满了待处理的任务,所以需要处理。
2.而下面两个数组的拷贝,我理解,只是纯粹得改变一下数组中任务的位置。 4 楼 he_wen 2011-04-14 谢谢你提的建议 确实是理解有点偏差 还有想说的是,本人现在在读研究生想在六月左右找一份实习的工作:
主要兴趣是对于高并发感兴趣,对多线程和网络的理论有深入的研究,希望有一个实践的平台

希望各位推荐推荐 谢谢

读书人网 >编程

热点推荐