点击上方“方志朋”,选择“设为星标”

回复”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. 线程池参数到底要怎么配?

    文章目录 1 线程池快速回顾 2 现有设置参数的方法及不足 3 如何设置核心线程数(corePoolSize) 4 如何设置最大线程数(maxPoolSize) 5 如何改变等待队列长度 想必大家对J ...

  2. 线程池参数及合理设置

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 一.线程池的7大核心参数 1. corePoolSize 核心线程数目核心线程会一直存活 ...

  3. burp爆破线程设置多少_多线程到底需要设置多少个线程?

    我们在使用线程池的时候,会有两个疑问点: 线程池的线程数量设置过多会导致线程竞争激烈 如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源 那么如何设置才不会影响系统性能呢?其实线程池的设置是 ...

  4. Java线程池的使用(合理设置线程池的大小)

    线程池工具类 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; im ...

  5. 线程池参数的合理设置

    一:线程池参数简介 ThreadPoolExecutor类可设置的参数主要有: corePoolSize:核心线程 1.核心线程会一直存活,及时没有任务需要执行 2.当线程数小于核心线程数时,即使有线 ...

  6. java如何关闭线程池_如何优雅的关闭Java线程池

    ⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...

  7. 线程池的五种状态及创建线程池的几种方式

    上篇<Java线程的6种状态详解及创建线程的4种方式> 前言:我们都知道,线程是稀有资源,系统频繁创建会很大程度上影响服务器的使用效率,如果不加以限制,很容易就会把服务器资源耗尽.所以,我 ...

  8. 项目使用线程池_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  9. spring线程池 java_Java 中几种常用的线程池

    概述: 在java内置API中操作线程所用到的类为Thread.创建线程一般有两种方式, 继承Thread方式 实现Runnable方式,并以runnable作为target创建Thread 在And ...

最新文章

  1. hibernate mysql annotation_hibernate学习笔记03-- hibernate + mysql + Annotation
  2. 用git发patch
  3. PXE安装linux
  4. boost::mpi模块对gather() 和gatherv() 集合的测试
  5. MySQL 基础 ———— 连接查询
  6. (矩阵快速幂)解所有类似Fibonacci 的题目
  7. 实用juniper SRX NAT小技巧。
  8. 神奇 | 神奇,原来 Linux 终端下还有这两种下载文件方式
  9. Python pip 用法大全
  10. JAVA音乐社交平台设计计算机毕业设计Mybatis+系统+数据库+调试部署
  11. python3.7怎么设置字体大小,python字体大小如何设置
  12. 变形菌门扩张——肠道微生态失调和炎症肠病的潜在特征
  13. 如何修改SnipeIT的部分设置
  14. 释放智能边缘广阔机遇,英特尔携手生态伙伴构建万物互联未来
  15. C语言超出类型数值范围的表示方法
  16. 码字 层映射 预编码的概念总结
  17. 5G爆发前夜,谷歌微软争相豪赌的云游戏厉害在哪?
  18. IDEA:Warning: No artifacts marked for deployment
  19. swagger首页空白
  20. android+祖玛游戏源码,unity祖玛游戏Zuma Ball Blast源码

热门文章

  1. 实用Jquery开发自己的插件
  2. 01--安装Activiti流程设计器eclipse插件
  3. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
  4. 如何利用遗传算法进行自变量降维
  5. Hadoop 三大发行版本
  6. 用 Python 写 3D 游戏,太赞了
  7. 限量!“Java成长笔记”Spring Boot/Sentinel/Nacos高并发
  8. 几经沉浮,人工智能前路何方?
  9. ​清华硕士爆料:这些才是机器学习必备的数学基础
  10. Python 编程语言的核心是什么?