• 主页
  • Java SE
  • J2ME
  • Web开发
  • Java EE
  • Eclipse

java 线程池 核心线程数、最大线程数、工作队列有界数、保活时间最优设置

孤独的冥王星 北京 android  2021-04-28 05:41:14
1.首先我是百度了,基本千篇一律,n+1,2n,还有根据时间算的,基本上说的都很模糊

2.请教了做java后台的5/10/15年工作经验的大佬,给出的回答有的说不会,有的也是百度之后告诉我的,有的把自己也是说迷糊了

3.看了一些三方框架里使用的线程池,怎么设置的都有,没有一个具体的公式或算法

请各位大佬指点,有没有什么权威的算法,设置这些参数时根据什么能算出最优数值
...全文
479 点赞 收藏 11
写回复
11 条回复
七海我老婆 05月11日
Doug Lea(java并发大师)写的java并发编程实战有说明
回复 点赞
引用 8 楼 PNZ.BeijingL 的回复:
线程池的工作方式大概是这样 1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,是就执行第二步。 2. 查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。 3. 查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。 4. 查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。 我是这么认为的,你可以参考, 也可能某些地方理解的不到位,也请大家指正 1.考虑当前使用的服务器性能和业务来觉,保证业务的前提条件下再考虑性能 比如:你的服务器是几核支持几线程,是否支持超线程, 这决定多线程的效果,比如你的服务器是4核支持8线程,线程池里你配置到100线程, 最多也只能8线程同时正常工作,不然多个一起工作互相抢夺CPU资源速度反而更慢了, 2.考虑业务量和处理性能, 如果你每秒任务的是几十个个, 你使用10线程的线程, 1000个队列,也用不到, 反而占用了资源,大概分析下数据量和处理速度算算多少能保证业务正常进行 3.监控一段时间后再调整调优
原理谁都懂,你这分析我觉得有道理,也是实际中应该考虑的地方
回复 点赞
=PNZ=BeijingL 04月29日
线程池的工作方式大概是这样
1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,是就执行第二步。
2. 查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。
3. 查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。
4. 查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。

我是这么认为的,你可以参考, 也可能某些地方理解的不到位,也请大家指正

1.考虑当前使用的服务器性能和业务来觉,保证业务的前提条件下再考虑性能
比如:你的服务器是几核支持几线程,是否支持超线程, 这决定多线程的效果,比如你的服务器是4核支持8线程,线程池里你配置到100线程, 最多也只能8线程同时正常工作,不然多个一起工作互相抢夺CPU资源速度反而更慢了,
2.考虑业务量和处理性能, 如果你每秒任务的是几十个个, 你使用10线程的线程, 1000个队列,也用不到, 反而占用了资源,大概分析下数据量和处理速度算算多少能保证业务正常进行
3.监控一段时间后再调整调优




回复 点赞
nayi_224 04月29日
1.特意百度了一下,这种基础问题不是都说的很清晰么?如果你觉得模糊,请把模糊的点给出来 2.如果你要说实际情况,其实基本都是凭感觉的,特别是cpu密集型,因为几乎不可能一个服务器上只跑一个项目 3.什么框架?把代码列出来
回复 点赞
引用 3 楼 七海我老婆 的回复:
我不记得我是读哪本书看的来着,有可能是java并发编程的艺术。。。
我到本书上看看里面怎么说的
回复 点赞
引用 4 楼 a975719898 的回复:
哪有什么最优,线程池类型就那几个,使用的场景有N种. 按需选用就完了.把IO密集和CPU密集区分开之后就是些定制的配置
一般创建线程池的时候不是用固定的那几个类型而是自定义线程池吧,固定类型有弊端
回复 点赞
a975719898 04月29日
哪有什么最优,线程池类型就那几个,使用的场景有N种. 按需选用就完了.把IO密集和CPU密集区分开之后就是些定制的配置
回复 点赞
七海我老婆 04月29日
我不记得我是读哪本书看的来着,有可能是java并发编程的艺术。。。
回复 点赞
七海我老婆 04月29日
一般cpu密集型任务核心线程数设置为n,io密集型任务的计算我忘了,好像很复杂,跟你任务的io耗时占比有关,工作队列啥的看你自己的业务
回复 点赞
七海我老婆 04月29日
并没有什么固定的计算方式
回复 点赞
宾灬 04月29日
看你的线程池主要用来做什么样的任务。如果是cpu密集型任务,比如要进行大量计算的,可以把线程数设置和cpu核心一致,线程切换也会消耗资源,如果开的太多,线程间切换成本就会提高。 如果任务主要是读和写,基本不涉及到计算,可以把线程数开多一点。 这个问题其实没有固定答案,要根据实际任务类型,机器硬件配置等综合因素来判断。 此外还要考虑任务提交速度和任务处理任务速度,如果提交的很快,处理得慢,那么队列中的任务数会积压,达到最大值就会拒绝,如果队列大小无限制,最后也会因为物理内存不足而挂掉。
回复 点赞
发动态
发帖子
Java
创建于2007-09-28

1.8w+

社区成员

8.1w+

社区内容

Java相关技术讨论
社区公告
暂无公告