第十五章 线程池的选用与线程数的指定
2016-01-22 12:03
267 查看
注意:本章主要参考自《大型分布式Java应用:基础与实践》和《大型网站技术架构:核心原理与案例分析》
1、选用的两个角度
高性能:将提交到线程池中的任务直接交给线程去处理(前提:线程数小于最大线程数),不入队
缓冲执行:希望提交到线程池的任务尽量被核心线程(corePoolSize)执行掉
2、高性能
队列:SynchronousQueue
最大线程数:一般设为Integer.MAX_VALUE(整数最大值),防止回绝任务
典型案例:newCachedThreadPool
尤其适合于执行耗时短的任务
注意:
设置好闲置失效时间,keepAliveTime,用于避免资源大量耗费
对于出现大量耗时长的任务,容易造成线程数迅速增加,这种情况要衡量使用该类线程池是否合适
3、缓冲执行
队列:LinkedBlockingQueue和ArrayBlockingQueue
典型案例:newFixedThreadPool(int threadSize)
注意:
使用该类线程池,最好使用LinkedBlockingQueue(无界队列),但是当大量并发任务的涌入,导致核心线程处理不过来,队列元素会大量增加,可能会报内存溢出
当然,对于上边这种情况的话,如果是ArrayBlockingQueue的话,如果设置得当,可以回绝一些任务,而不报内存溢出
4、线程数的确定
公式:启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU核数
注意:
如果任务大都是CPU计算型任务,启动线程数=CPU核数
如果任务大多需要等待磁盘操作,网络响应,启动线程数可以参照公式估算,当然>CPU核数
总结:
一般使用线程池,按照如下顺序依次考虑(只有前者不满足场景需求,才考虑后者):
newCachedThreadPool-->newFixedThreadPool(int threadSize)-->ThreadPoolExecutor
newCachedThreadPool不需要指定任何参数
newFixedThreadPool需要指定线程池数(核心线程数==最大线程数)
ThreadPoolExecutor需要指定核心线程数、最大线程数、闲置超时时间、队列、队列容量,甚至还有回绝策略和线程工厂
对于:newFixedThreadPool和ThreadPoolExecutor的核心数可以参照上述给出的公式进行估算。
1、选用的两个角度
高性能:将提交到线程池中的任务直接交给线程去处理(前提:线程数小于最大线程数),不入队
缓冲执行:希望提交到线程池的任务尽量被核心线程(corePoolSize)执行掉
2、高性能
队列:SynchronousQueue
最大线程数:一般设为Integer.MAX_VALUE(整数最大值),防止回绝任务
典型案例:newCachedThreadPool
尤其适合于执行耗时短的任务
注意:
设置好闲置失效时间,keepAliveTime,用于避免资源大量耗费
对于出现大量耗时长的任务,容易造成线程数迅速增加,这种情况要衡量使用该类线程池是否合适
3、缓冲执行
队列:LinkedBlockingQueue和ArrayBlockingQueue
典型案例:newFixedThreadPool(int threadSize)
注意:
使用该类线程池,最好使用LinkedBlockingQueue(无界队列),但是当大量并发任务的涌入,导致核心线程处理不过来,队列元素会大量增加,可能会报内存溢出
当然,对于上边这种情况的话,如果是ArrayBlockingQueue的话,如果设置得当,可以回绝一些任务,而不报内存溢出
4、线程数的确定
公式:启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU核数
注意:
如果任务大都是CPU计算型任务,启动线程数=CPU核数
如果任务大多需要等待磁盘操作,网络响应,启动线程数可以参照公式估算,当然>CPU核数
总结:
一般使用线程池,按照如下顺序依次考虑(只有前者不满足场景需求,才考虑后者):
newCachedThreadPool-->newFixedThreadPool(int threadSize)-->ThreadPoolExecutor
newCachedThreadPool不需要指定任何参数
newFixedThreadPool需要指定线程池数(核心线程数==最大线程数)
ThreadPoolExecutor需要指定核心线程数、最大线程数、闲置超时时间、队列、队列容量,甚至还有回绝策略和线程工厂
对于:newFixedThreadPool和ThreadPoolExecutor的核心数可以参照上述给出的公式进行估算。
相关文章推荐
- Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记之"坑"
- sed应用之(一)
- Git 分支 - 远程分支
- Oracle Database SQL Language Reference 笔记(1)—— Oracle SQL 简介
- OpenStack能否成为下一个Linux?
- redis和ehcache比较
- mac命令
- ImageLoader must be init with configuration before using
- hidesBottomBarWhenPushed如何正确使用
- 雅虎十四条:网站前端网页优化的14条原则
- ThinkPHP中U方法 在模板输出变量给 U方法传参 小记
- 对于限制UITextView输入的字符数
- wordpress 修改后台登陆入口(小松独创)
- Android App的签名打包(晋级篇)
- 字符串操作2 - 递归打印字符串
- Java基础之AtomicInteger
- ①C#,利用数组求一个范围内的质数
- 将MySQL数据库表结构,自动生成PDM方法
- nginx+tomcat+memcached共享session-id
- 2015年最弱的密码和最强的密码