锁定老帖子 主题:管理你的线程池(Executor)
精华帖 (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,这种算法是错的。 没溢出,内存不会溢出,先不管我的内存计算方法 我是说,线程队列满了,然后循环程序还在跑,这时候线程池新加的线程,到哪里去了? 不是加的线程到哪里去的问题,而是如果你限制了任务缓存队列的尺寸,到底能不能加进去的问题!建议自己去看源码。 我可以给出一个结论-会抛出异常。 |
|
返回顶楼 | |
发表时间:2010-12-17
effective java 里讲的很清楚
|
|
返回顶楼 | |
发表时间:2010-12-17
yunchow 写道 effective java 里讲的很清楚
除了effective java、Java编程思想,我推荐《Java 核心技术》(机械工业出版社,基础讲的很透彻)。 不知在Java核心技术方面大家还有什么好书推荐的? |
|
返回顶楼 | |
发表时间:2010-12-17
能不能给个源码呢?O(∩_∩)O~,先谢楼主
|
|
返回顶楼 | |
发表时间:2010-12-17
sam_kee 写道 能不能给个源码呢?O(∩_∩)O~,先谢楼主
估计这位仁兄没认真看,是JDK里的固有类。 |
|
返回顶楼 | |
发表时间:2010-12-18
最后修改:2010-12-18
挺好,再分析形象一点就更好了。
补充2点吧 引用 继承ThreadPoolExecutor类,覆写beforeExecute() 1,貌似不好extends,有很多final private,用组合来做更好。 2,ThreadPoolExecutor有4种中断策略来应对非常极端的没有线程可用且无法缓存任务的情况。 |
|
返回顶楼 | |
发表时间:2011-08-14
写得不错~不过建议把线程池理解得更深刻的办法就是自己多写一些例子,分析一下内存\CPU\以及处理数据库操作时IO的实际情况~这样能理解得更深刻,去理解为什么线程池的内部实现实这样的,core线程,队列,minmax设置多少都是跟实际情况相关联的~~偶感觉学一个知识点遇到问题去应用之是第一步,源码分析原理探索是第二,总结些自己的东西,结合实际去探索不同的情况是第三步,创造就是第四步啦~大多数人都只能做到第三步,希望你更加努力哈~~~偶是你的学姐,还记得的吧~加油哦!
|
|
返回顶楼 | |
发表时间:2011-08-15
lijingyao8206 写道 觉学一个知识点遇到问题去应用之是第一步,源码分析原理探索是第二,总结些自己的东西,结合实际去探索不同的情况是第三步,创造就是第四步哦! 很有道理,螺旋式上升,在理论和实践之间转换。有些时候,还真的感觉技术的学习遇到瓶颈,不知到你有没有这种情况
|
|
返回顶楼 | |
发表时间:2011-12-10
文章写的可以,浅显易懂。不过这东西还真得和实际运行起来。
|
|
返回顶楼 | |