java线程池的参数设置

在说如何对线程池优化之前重复一下线程的7大参数

  • corePoolSize: 核心线程数,也是线程池中常驻的线程数,线程池初始化时默认是没有线程的,当任务来临时才开始创建线程去执行任务

  • maximumPoolSize: 最大线程数,在核心线程数的基础上可能会额外增加一些非核心线程,需要注意的是只有当workQueue队列填满时才会创建多于corePoolSize的线程(线程池总线程数不超过maxPoolSize)

  • keepAliveTime: 非核心线程的空闲时间超过keepAliveTime就会被自动终止回收掉,注意当corePoolSize=maxPoolSize时,keepAliveTime参数也就不起作用了(因为不存在非核心线程);

  • unit: keepAliveTime的时间单位

  • workQueue: 用于保存任务的队列,可以为无界、有界、同步移交三种队列类型之一,当池子里的工作线程数大于corePoolSize时,这时新进来的任务会被放到队列中

  • threadFactory: 创建线程的工厂类,默认使用Executors.defaultThreadFactory(),也可以使用guava库的ThreadFactoryBuilder来创建

  • handler: 线程池无法继续接收任务(队列已满且线程数达到maximunPoolSize)时的饱和策略,取值有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy

核心线程设置

计算密集型

当线程执行的是计算密集型的任务,那么要尽量防止线程的上下文切换,所以要设置的线程数要较少一点,一般设置为 线程数 = CPU核数+1,也可以设置成CPU核数*2

I/0密集型

在 WEB 应用中 涉及到大量的 i/o传输 , 一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。我们可以多设置一些线程池中线程的数量,这样就能让在等待IO的这段时间内,其他线程可以去做其它事,提高并发处理效率。对于IO密集型应用:
线程数 = CPU核心数/(1-阻塞系数) 这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9

其他参数设置

  1. 根据不同的场景选择不同适合的拒绝策略 , 也可以实现RejectedExecutionHandler接口自定义拒绝策略
  2. 使用线程工厂创建线程时正确的对线程命名,便于排查问题
  3. 我们也可以调用shutdown来手动终止线程池。如果我们忘记调用shutdown,为了让线程资源被释放,我们还可以使用keepAliveTime 和 allowCoreThreadTimeOut来达到目的
  4. ThreadPoolExecutor提供了protected类型可以被覆盖的钩子方法,我们可以使用beforeExecute和afterExecute来记录线程之前前和后的一些运行情况

java线程池的参数设置相关推荐

  1. Java 线程池及参数动态调节详解

    前前言:本文搬自:why技术 前言:曾经自诩对线程池了如指掌,不料看了美团的一篇技术文章后才知道原来线程池的参数还可以动态调节. 经典面试题 在这篇文章中我主要回答上面抛出的这个问题:你这几个参数的值 ...

  2. Java线程池七大参数详解和配置

    目录 一.corePoolSize核心线程数 二.maximunPoolSize最大线程数 三.keepAliveTime空闲线程存活时间 四.unit空闲线程存活时间的单位 五.workQueue线 ...

  3. Java线程池ThreadPoolExecutor参数讲解、实例助记 保证你过目不忘

    ThreadPoolExecutor构造器的参数说明 参数一:指定线程池的核心线程数量(核心线程,长久不死亡): corePoolSize 不能小于0 参数二:指定线程池可支持的最大线程数: maxi ...

  4. 线程池到底参数设置多少线程才合适?

    目录 一.抛出问题 二.分析 三.实际应用 四.总结: 抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 「第一派:<Java Con ...

  5. java 线程池ThreadPoolExecutor

    线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数 ...

  6. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  7. java线程池功能_Java线程池总结

    一.线程池 线程池适合处理的任务:执行时间短.工作内容较为单一. 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可 ...

  8. java 线程池技术_JAVA36计之---线程池技术

    各位兄弟姐妹,大家肯定对于java线程池比较熟悉了吧,不过这篇肯定还是会让你收获满满 654法则大家要记者---6大核心参数,5大线程池,4种拒绝策略 在Java中使用线程池,可以用ThreadPoo ...

  9. Java线程池的核心线程数和最大线程数

    Java的线程池就像是一个花瓶容器. 而把任务提交给线程池就像是把小球塞进花瓶. 整个过程就像下面这个有趣的动画: 下面我们先来了解一下Java线程池的参数. 希望看完这篇文章后, 再提起线程池的时候 ...

最新文章

  1. c# winform编程之多线程ui界面资源修改总结篇
  2. solr/lucence和关系数据库的混合使用
  3. 3.2.2.5 BRE运算符优先级
  4. 图解 Java 常用数据结构
  5. djano 字段不重复_Java 14 发布了,不使用quot;classquot;也能定义类了?还顺手要干掉Lombok!...
  6. 【推荐】本周值得关注的将开源论文,包含分类、分割、人脸、目标检测、ReID等...
  7. 3005-基于二叉链表的二叉树最大宽度的计算(附思路,注释,可能错误分析)
  8. Nginx限速模块初探
  9. 为什么实际频率只有1.8G的AMD 2500+处理器运行速度比实际频率2.4G的P4-2.4B还快
  10. ubuntu 安装openproj-1.4-2.noarch.rpm
  11. 软件测试适不适合女生来做?女生做软件测试有哪些好处?
  12. Android 加载进度条,加载成功,数据为空,加载失败,无网络等状态不同界面的切换
  13. 微软人工智能公开课.md
  14. 爬取拉勾网招聘信息笔记
  15. 手机软件自动化测试探索
  16. Mac下mysql安装,MySQLclient
  17. 我的世界租赁服务器重置,《我的世界》租赁服自动砍树命令教程 命令方块介绍...
  18. 人生感悟:他们这样爬出烂泥般的人生
  19. CEPI扩大与三叶草生物合作,资助“S-三聚体”新冠疫苗候选物全球II/III期临床研究以获上市许可
  20. EAUML日拱一卒-状态图::基本要素画法

热门文章

  1. 详解TCP/IP协议栈面临的五大网络安全问题
  2. 充电宝GB4943检测标准与项目介绍
  3. h5 农场游戏开源_下一个开源领域是农场
  4. MySQL数据文件介绍及存放位置
  5. python3 enumerate函数_python3 内置函数enumerate
  6. ArcGIS教程:ArcGIS中的报表
  7. 第一周------继续
  8. python的冒泡排序
  9. CH579(M0内核)中断向量表偏移处理
  10. 【IoC 和 DI 有什么区别】