java中线程池参数设置
大家好,又见面了,我是你们的朋友全栈君。
本文主要介绍线程池是解决了哪些问题以及线程池中 的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.cn/135097.html原文链接:https://javaforall.cn
相关文章
- java分层打印二叉树_基于Java的二叉树层序遍历打印实现
- 深入理解Java虚拟机–javac命令[通俗易懂]
- java 实现 按位异或_Java 按位异或的性质及其妙用
- 如何做好Flex与Java交互「建议收藏」
- import java.io 是什么意思_Java IO 详解
- 解析Java中文乱码的处理方法
- java实现发送手机验证码功能
- setproperty java_Java中System.setProperty()的用法
- java 雪崩效应,七、微服务架构中的“雪崩效应”
- Java面向对象三大特性(封装、继承、多态)
- Java版五子棋小游戏(java控制台)
- Java 8 的 java.util.function.* POJO 的反射新方法
- java 设置400错误_Java项目报400错误的原因与解决方法
- Java Statement.getResultSet()方法:获取结果集
- 程序Linux命令调用Java程序实现交互(linux命令java)
- 策略Java环境下基于Redis的过期策略(redisjava过期)
- Linux与Java:驱动着计算未来(linux与java)
- 快速揭秘Redis Java版(redisjava版)
- 使用Java实现Redis数据存储(redis集成java)
- 缓存Redis与Java实现过期数据缓存(redisjava过期)
- Using Java to Work with MongoDB: A Guide for Developers(java操作mongodb)
- Linux平台上C语言接口调用Java语言实现(linux c调java)
- 一起学习Java的Oracle包(java的oracle包)
- Java 离开 Oracle,新的旅程即将开始(java没有Oracle)
- Java实现与Oracle数据库的无缝整合(java整合oracle)
- java调用c程序通信示例代码