0
点赞
收藏
分享

微信扫一扫

java线程池-设置线程数


怎么设置线程数以达到最佳运行效果?[面试7.0]

获取CPU核心数量N(在Cpu占用过高时,应该设法降低每个任务的处理时间,避免Cpu占用过高的原则下设计一下这些参数的值)
Cpu密集型:
比较消耗CPU资源,计算型的
设置为(核心线程数): N+1->加一是因为防止CPU处于空闲,充分利用CPU空闲核心
IO密集型:
大部分时间处理IO,这时不占用CPU,可以多配置一些线程
设置为(核心线程数): 2N+1
定时推送:
设置为(核心线程数): N*(1+WT)/ST,其中WT是线程等待时间,ST是线程运行时间

精确设置方式:
1.tasks: 程序每秒需要处理的最大任务数量(假设系统每秒任务数为100)
2.tasktime: 单线程处理一个任务所需要的时间(每个任务耗时0.1秒)
3.responsetime: 系统允许任务最大的响应时间(每个任务的响应时间不得超过2秒)

corePoolSize(核心线程数):
每秒任务数为100,每个任务耗时0.1秒
则每秒线程数为需要100x0.1=10线程
这时corePoolSize应该设置为大于10

maxPoolSize(最大线程数):
考虑到增加10倍每秒任务数,那么当每秒1000个任务时,需要(1000-queueCapacity)*0.1,即80个最大线程

queueCapacity(任务队列的长度):
任务队列长度 = (corePoolSize/tasktime)*responsetime = (10/0.1)*2 = 200,记忆:cr/t
如果设置太长的话,将会导致线程数始终是corePoolSize,任务量陡增时,响应时间也陡增

keepAliveTime(若一个线程空闲时间达到这个时间就终止):
keepAliveTime设定值可根据任务峰值持续时间来设定


举报

相关推荐

0 条评论