论坛首页 Java企业应用论坛

管理你的线程池(Executor)

浏览 16881 次
精华帖 (0) :: 良好帖 (6) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-16  
78425665 写道
贾懂凯 写道
78425665 写道
我有个问题,还请指教下。

像这样
		int i = 0;
		while(i++ < 50000){
			Object obj = "...";// 假设这个obj有点大,会占点内存,假如每个占1M
			threadPool.execute(new MyThread(obj));// threadPool继承的ThreadPoolExecutor
		}


假如corePoolSize=10,maximumPoolSize = 15吧

跑了不到一分钟,发现机器内存(1G)全被吃光了。队列都满了,可程序还在跑,threadPool还在加线程,这时它加到哪里去了?

建议测试一下,内存满了看是不是还能加。如果还能加,那只能说明你的内存计算方法是错的,根本没溢出,不是一个Object 1M10个Object就是10M,这种算法是错的。


没溢出,内存不会溢出,先不管我的内存计算方法

我是说,线程队列满了,然后循环程序还在跑,这时候线程池新加的线程,到哪里去了?

不是加的线程到哪里去的问题,而是如果你限制了任务缓存队列的尺寸,到底能不能加进去的问题!建议自己去看源码。
我可以给出一个结论-会抛出异常。
0 请登录后投票
   发表时间:2010-12-17  
effective java 里讲的很清楚
0 请登录后投票
   发表时间:2010-12-17  
yunchow 写道
effective java  里讲的很清楚

除了effective java、Java编程思想,我推荐《Java 核心技术》(机械工业出版社,基础讲的很透彻)。
不知在Java核心技术方面大家还有什么好书推荐的?
0 请登录后投票
   发表时间:2010-12-17  
能不能给个源码呢?O(∩_∩)O~,先谢楼主
0 请登录后投票
   发表时间:2010-12-17  
sam_kee 写道
能不能给个源码呢?O(∩_∩)O~,先谢楼主

估计这位仁兄没认真看,是JDK里的固有类。
0 请登录后投票
   发表时间:2010-12-18   最后修改:2010-12-18
挺好,再分析形象一点就更好了。
补充2点吧

引用

继承ThreadPoolExecutor类,覆写beforeExecute()

1,貌似不好extends,有很多final private,用组合来做更好。

2,ThreadPoolExecutor有4种中断策略来应对非常极端的没有线程可用且无法缓存任务的情况。
0 请登录后投票
   发表时间:2011-08-14  
写得不错~不过建议把线程池理解得更深刻的办法就是自己多写一些例子,分析一下内存\CPU\以及处理数据库操作时IO的实际情况~这样能理解得更深刻,去理解为什么线程池的内部实现实这样的,core线程,队列,minmax设置多少都是跟实际情况相关联的~~偶感觉学一个知识点遇到问题去应用之是第一步,源码分析原理探索是第二,总结些自己的东西,结合实际去探索不同的情况是第三步,创造就是第四步啦~大多数人都只能做到第三步,希望你更加努力哈~~~偶是你的学姐,还记得的吧~加油哦!
0 请登录后投票
   发表时间:2011-08-15  
lijingyao8206 写道
觉学一个知识点遇到问题去应用之是第一步,源码分析原理探索是第二,总结些自己的东西,结合实际去探索不同的情况是第三步,创造就是第四步哦!
很有道理,螺旋式上升,在理论和实践之间转换。有些时候,还真的感觉技术的学习遇到瓶颈,不知到你有没有这种情况
0 请登录后投票
   发表时间:2011-12-10  
文章写的可以,浅显易懂。不过这东西还真得和实际运行起来。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics