博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十五章 线程池的选用与线程数的指定
阅读量:5283 次
发布时间:2019-06-14

本文共 1064 字,大约阅读时间需要 3 分钟。

注意:本章主要参考自《大型分布式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的核心数可以参照上述给出的公式进行估算。

转载于:https://www.cnblogs.com/java-zhao/p/5150781.html

你可能感兴趣的文章
数据库查询问题小记
查看>>
validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符...
查看>>
css3新单位vw、vh、vmin、vmax的使用详解(转载)
查看>>
软件测试培训第30天
查看>>
创建守护进程步骤与setsid()
查看>>
[iOS]Win8下iTunes无法连接iPhone版本的解决方法
查看>>
鸟哥私房菜基础篇:Linux 磁碟与档案系统管理习题
查看>>
垂直居中及水平垂直居中方案(共15种)
查看>>
JavaScript高级程序设计26.pdf
查看>>
jquery 对 table 的操作
查看>>
centos7 关闭防火墙
查看>>
Android 拍照图片选取与图片剪裁
查看>>
百度地图轨迹回放,自定义路书,边走边画线
查看>>
数字操作类
查看>>
NVME SSD vs SATA SSD(转)
查看>>
搜索实时个性化模型——基于FTRL和个性化推荐的搜索排序优化
查看>>
漫画解读“跨视图粒度计算”,了解有数分析利器
查看>>
【c++ primer读书笔记】【第3章】字符串、向量和数组
查看>>
ATL CAxWindow类创建问题一则
查看>>
【Android Developers Training】 31. 序言:共享简单数据
查看>>