java中线程池参数设置

java中线程池参数设置本文主要介绍线程池是解决了哪些问题以及线程池中的corePoolSize(核心线程数),queueCapacity(等待队列的长度),maximumPoolSize(最大核心线程数)。本文不会对线程池各个参数介绍,假定你已经了解了线程池各个参数的含义。1为什么要有线程池呢?当前实际应用中,经常会遇到单个请求处理时间短但请求量巨大但问题,简单说就是qps很高,平响时间很短的情况。…

大家好,又见面了,我是你们的朋友全栈君。

    本文主要介绍线程池是解决了哪些问题以及线程池中 的corePoolSize(核心线程数),queueCapacity(等待队列的长度),maximumPoolSize(最大核心线程数)。本文不会对线程池各个参数介绍,假定你已经了解了线程池各个参数的含义。

1 为什么要有线程池呢?

当前实际应用中,经常会遇到单个请求处理时间短但请求量巨大但问题,简单说就是qps很高,平响时间很短的情况。这些情况下如果采用来一个任务就新建一个线程处理,那么会有什么问题呢?

1、每个任务新建一个线程,qps越高,就越消耗cpu资源新建线程;平响很短也需要cpu不断的销毁线程。从而会大量消耗cpu资源

2、创建的线程越多,cpu在处理任务时,线程切换相对更加频繁。导致cpu浪费在线程切换上的时间就会变长,从而会增加平响时间。

3、每个线程的创建都是要消耗内存资源的。高qps情况下容易出现OOM(unable to create new native Thread)

4、操作系统本身也不允许线程无限对增长

基于以上4个问题,线程池应运而生。

线程池中核心线程数能够重复使用,应对高qps无须频繁新建线程,进而减少线程之间切换的耗时;阻塞队列能够暂时缓存新到任务,作为新建线程的缓冲池。

2 线程池核心参数的计算

先列出计算公式,然后举例解释说明

2.1 核心线程数

corePoolSize=20% * taskNum/(单线程/AR)=20% * 任务数 * 平响

taskNum是指任务数量/请求数量等,可以简单理解成是qps,

AR是指每个任务的平均处理时间,

20%是根据8020定律得来的,简单理解是80%的情况下,核心的任务数大约占到20%

2.2 工作队列长度

queueCapacity=(corePoolSize/AR)* MR

corePoolSize为上面计算出来的核心线程数,

AR是指每个任务的平均处理时间,

MR表示任务能够接受的最大响应时间

2.3 最大核心线程数

maximumPoolSize=(taskNum-queueCapacity)/(单线程/AR)

taskNum是指任务数量/请求数量等,可以简单理解成是qps,

queueCapacity为等待队列的长度,

AR是指每个任务的平均处理时间,

2.4 举例

假定任务数是100个/s,平均响应时间是0.1s,能够接受的最大响应时间是0.5s则

corePoolSize=20% * taskNum/(单线程/AR)=20% * 任务数 * 平响=20% * 100 个/s * 0.1s=2个

queueCapacity=(corePoolSize/AR)* MR=2个/0.1s *0.5s=10个

maximumPoolSize=(taskNum-queueCapacity)/(单线程/AR)=(100-10)/(1/0.1)=9个

根据上面推到就能大致算出核心参数的取值,但是是有前提假定的,即资源是无限的。根据公式算出来的只是一个理论参考值。实际线上参数配置还是要以此为基础进行微调

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135097.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 中英文切换资源文件的问题

    中英文切换资源文件的问题

    2021年8月17日
    68
  • 交换机的背板带宽计算方式

    交换机的背板带宽计算方式交换机的背板带宽 是交换机接口处理器或接口卡和数据总线间所能吞吐的最大数据量 背板带宽标志了交换机总的数据交换能力 单位为 Gbps 也叫交换带宽 一般的交换机的背板带宽从几 Gbps 到上百 Gbps 不等 一台交换机的背板带宽越高 所能处理数据的能力就越强 但同时设计成本也会越高 一般来讲 计算方法如下 1 线速的背板带宽考察交换机上所有端口能提供的总带宽 计

    2025年7月9日
    2
  • linux挂载磁盘教程「建议收藏」

    linux挂载磁盘教程「建议收藏」本文中的磁盘/dev/sdb为笔者测试服务器上的命名,在您的服务器中可能是/dev/xdb、/dev/vdb、/dev/xvdb等等请根据实际情况进行修改.1、创建挂载目录mkdir-p/www2、确认是否没有分区的磁盘,如下图,没有分区的磁盘是/dev/sdb,在您的服务器中可能是/dev/vdb,请注意按照实际名称修改fdisk-l3、为磁盘分区,若已分区,可跳过fdisk/dev/sdb4、输入n开始创建分区5、输…

    2022年6月19日
    78
  • jvm基础_java实现栈四个方法

    jvm基础_java实现栈四个方法JVM进阶(一)——初识JAVA栈  若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。  下面言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看图:  这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。  栈是我们最常用的内存区域。它主

    2022年9月6日
    6
  • HTML5新控件 – 日期和时间选择输入

    HTML5新控件 – 日期和时间选择输入转载自:https://blog.csdn.net/u014063717/article/details/50914466HTML5定义了几个与日期有关的新控件。支持日期控件的浏览器会提供一个方便的下拉式日历,供用户选择。注意:我测试了Chrome和Opera,火狐提供下拉式日历支持,其它浏览器可能仍是一个普通文本框。1,日期控件-date<inputtype="date"valu…

    2022年5月24日
    264
  • 无需插件只使用浏览器下载b站视频

    无需插件只使用浏览器下载b站视频2017.10.07更新:由于现在bilibili更改了refer的Host并使用了防盗链,原文的方法直接下载会有403错误,在博主琢磨出新的抓包方法之前可以先使用以下的方法:在bilibili网址前加上kan,然后回车,加载出来的东西应该就很直白了。例子:地址栏中的https://www.bilibili.com/video/av11175437/加上kan以后变成https:

    2022年7月12日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号