0
点赞
收藏
分享

微信扫一扫

java并发编程(12)-- 线程池 实际⽣产使⽤哪⼀个线程池 怎么设置

小月亮06 2022-03-30 阅读 72


一、ThreadPoolExecutor

⽤ LinkedBlockingQueue 实现的,这个队列最⼤⻓度为 Integer.MAX_VALUE ,显然会导致OOM。

所 以实际⽣产⼀般⾃⼰通过 ThreadPoolExecutor 的7个参数,⾃定义线程池。

ExecutorService threadPool = new ThreadPoolExecutor(
2,
80*2,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()

);


二、⾃定义线程池参数选择

对于CPU密集型任务,最⼤线程数是CPU线程数+1。

对于IO密集型任务,尽量多配点,可以是CPU线程数*2,或者CPU线程数/(1-阻塞系数)。

java并发编程(12)-- 线程池 实际⽣产使⽤哪⼀个线程池 怎么设置_单核


IO密集型,即该任务需要⼤量的IO,即⼤量的阻塞。

在单线程上运⾏IO密集型的任务会导致浪费⼤量的CPU运算能⼒浪费在等待。

所以在IO密集型任务中使⽤多线程可以⼤⼤的加速程序运⾏,及时在单核CPU上,这种加速主要就是利⽤了被浪费掉的阻塞时间。


IO密集型时,⼤部分线程都阻塞,故需要多配置线程数:

参考公式:CPU核数 /(1 - 阻塞系数 )

阻塞系数在 0.8~0.9 之间

⽐如 8 核 CPU:8/1 - 0.9 = 80个线程数








举报

相关推荐

0 条评论