您当前的位置: 首页 >  Java
  • 0浏览

    0关注

    1477博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

软件工程小施同学 发布时间:2021-02-08 13:29:01 ,浏览量:0

一、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-阻塞系数)。

 

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

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

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

 

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

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

阻塞系数在 0.8~0.9 之间

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

 

 

 

 

 

 

关注
打赏
1665320866
查看更多评论
立即登录/注册

微信扫码登录

0.1328s