问一下,线程池里面到底该设置多少个线程?
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试文章
作者:只会一点java
cnblogs.com/dennyzhangdd/p/6909771.html
一、抛出问题
关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下:
第一派:《Java Concurrency in Practice》即《java并发编程实践》,如下图:
如上图,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:
Nthreads=NcpuUcpu(1+w/c),其中
Ncpu=CPU核心数
Ucpu=cpu使用率,0~1
W/C=等待时间与计算时间的比率
第二派:《Programming Concurrency on the JVM Mastering》即《Java 虚拟机并发编程》
线程数=Ncpu/(1-阻塞系数)
二、分析
对于派系一,假设cpu100%运转,即撇开CPU使用率这个因素,线程数=Ncpu*(1+w/c)。
现在假设将派系二的公式等于派系一公式,即Ncpu/(1-阻塞系数)=Ncpu*(1+w/c),===》阻塞系数=w/(w+c),即阻塞系数=阻塞时间/(阻塞时间+计算时间),这个结论在派系二后续中得到应征,如下图:
由此可见,派系一和派系二其实是一个公式……这样我就放心了……
三、实际应用
那么实际使用中并发线程数如何设置呢?分析如下(我们以派系一公式为例):
Nthreads=Ncpu*(1+w/c)
IO密集型:一般情况下,如果存在IO,那么肯定w/c>1(阻塞耗时一般都是计算耗时的很多倍),但是需要考虑系统内存有限(每开启一个线程都需要内存空间),这里需要上服务器测试具体多少个线程数适合(CPU占比、线程数、总耗时、内存消耗)。如果不想去测试,保守点取1即,Nthreads=Ncpu*(1+1)=2Ncpu。这样设置一般都OK。扩展一下:JAVA多线程和并发基础面试问答
计算密集型:假设没有等待w=0,则W/C=0. Nthreads=Ncpu。
至此结论就是:
IO密集型=2Ncpu(可以测试后自己控制大小,2Ncpu一般没问题)(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)
计算密集型=Ncpu(常出现于线程中:复杂算法)
java中:Ncpu=Runtime.getRuntime().availableProcessors()
当然派系一种《Java Concurrency in Practice》还有一种说法,
即对于计算密集型的任务,在拥有N个处理器的系统上,当线程池的大小为N+1时,通常能实现最优的效率。(即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。)
即,计算密集型=Ncpu+1,但是这种做法导致的多一个cpu上下文切换是否值得,这里不考虑。读者可自己考量。
四、总结:
选择线程池并发线程数的因素很多:任务类型、内存等线程中使用到所有资源都需要考虑。
热门内容:Spring Boot“内存泄漏”?看看美团大牛是如何排查的十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统(附源码)
干掉cms,zgc才是未来Elasticsearch 在各大互联网公司大量真实的应用案例!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
问一下,线程池里面到底该设置多少个线程?相关推荐
- 线程池参数到底要怎么配?
文章目录 1 线程池快速回顾 2 现有设置参数的方法及不足 3 如何设置核心线程数(corePoolSize) 4 如何设置最大线程数(maxPoolSize) 5 如何改变等待队列长度 想必大家对J ...
- 线程池参数及合理设置
点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 一.线程池的7大核心参数 1. corePoolSize 核心线程数目核心线程会一直存活 ...
- burp爆破线程设置多少_多线程到底需要设置多少个线程?
我们在使用线程池的时候,会有两个疑问点: 线程池的线程数量设置过多会导致线程竞争激烈 如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源 那么如何设置才不会影响系统性能呢?其实线程池的设置是 ...
- Java线程池的使用(合理设置线程池的大小)
线程池工具类 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; im ...
- 线程池参数的合理设置
一:线程池参数简介 ThreadPoolExecutor类可设置的参数主要有: corePoolSize:核心线程 1.核心线程会一直存活,及时没有任务需要执行 2.当线程数小于核心线程数时,即使有线 ...
- java如何关闭线程池_如何优雅的关闭Java线程池
⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...
- 线程池的五种状态及创建线程池的几种方式
上篇<Java线程的6种状态详解及创建线程的4种方式> 前言:我们都知道,线程是稀有资源,系统频繁创建会很大程度上影响服务器的使用效率,如果不加以限制,很容易就会把服务器资源耗尽.所以,我 ...
- 项目使用线程池_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...
△ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...
- spring线程池 java_Java 中几种常用的线程池
概述: 在java内置API中操作线程所用到的类为Thread.创建线程一般有两种方式, 继承Thread方式 实现Runnable方式,并以runnable作为target创建Thread 在And ...
最新文章
- hibernate mysql annotation_hibernate学习笔记03-- hibernate + mysql + Annotation
- 用git发patch
- PXE安装linux
- boost::mpi模块对gather() 和gatherv() 集合的测试
- MySQL 基础 ———— 连接查询
- (矩阵快速幂)解所有类似Fibonacci 的题目
- 实用juniper SRX NAT小技巧。
- 神奇 | 神奇,原来 Linux 终端下还有这两种下载文件方式
- Python pip 用法大全
- JAVA音乐社交平台设计计算机毕业设计Mybatis+系统+数据库+调试部署
- python3.7怎么设置字体大小,python字体大小如何设置
- 变形菌门扩张——肠道微生态失调和炎症肠病的潜在特征
- 如何修改SnipeIT的部分设置
- 释放智能边缘广阔机遇,英特尔携手生态伙伴构建万物互联未来
- C语言超出类型数值范围的表示方法
- 码字 层映射 预编码的概念总结
- 5G爆发前夜,谷歌微软争相豪赌的云游戏厉害在哪?
- IDEA:Warning: No artifacts marked for deployment
- swagger首页空白
- android+祖玛游戏源码,unity祖玛游戏Zuma Ball Blast源码