用了这么久线程池,你真的知道如何合理配置线程数吗?

Posted androidstarjack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用了这么久线程池,你真的知道如何合理配置线程数吗?相关的知识,希望对你有一定的参考价值。

点击上方关注 “终端研发部


 

设为“星标”,和你一起掌握更多数据库知识

一、线程池如何配置合理线程数

(1)CPU密集型:

定义:CPU密集型的意思就是该任务需要大量运算,而没有阻塞,CPU一直全速运行。

CPU密集型任务只有在真正的多核CPU上才可能得到加速(通过多线程)。

CPU密集型任务配置尽可能少的线程数。

“CPU密集型线程数配置公式:(CPU核数+1)个线程的线程池

(2)IO密集型:

定义:IO密集型,即该任务需要大量的IO,即大量的阻塞。

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

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

第一种配置方式:

由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程。

“配置公式:CPU核数 * 2。

第二种配置方式:

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

“配置公式:CPU核数 / (1 – 阻塞系数)(0.8~0.9之间)

比如:8核 / (1 – 0.9) = 80个线程数

二、自定义线程池

package com.lxk.com;
import java.util.concurrent.*;
/**
 * 自定义线程池
 */
public class ThreadPoolDemoFour 
    public static void main(String[] args) 


        // 自定义线程池
        ExecutorService threadPool = new ThreadPoolExecutor(3,
                5,
                60,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        try 
            for (int i = 0; i < 10; i++) 
                threadPool.execute(() -> 
                    System.out.println(Thread.currentThread().getName() + "\\t 办理业务");
                );


            
         catch (Exception e) 
            e.printStackTrace();
         finally 
            threadPool.shutdown();
        
    

三、实际使用JDK内置的哪个线程池?

【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。

【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明:Executors返回的线程池对象的弊端如下:

  • FixedThreadPool和SingleThreadPool: 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。

  • CachedThreadPool和ScheduledThreadPool: 允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

来源:lixinkuan.blog.csdn.net/article/details/94501073

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

写在最后的话

大家看完有什么不懂的可以在下方留言讨论,也可以私信问我一般看到后我都会回复的。最后觉得文章对你有帮助的话记得点个赞哦,点点关注不迷路
@终端研发部
每天都有新鲜的干货分享!

回复 【idea激活】即可获得idea的激活方式
回复 【Java】获取java相关的视频教程和资料
回复 【SpringCloud】获取SpringCloud相关多的学习资料
回复 【python】获取全套0基础Python知识手册
回复 【2020】获取2020java相关面试题教程
回复 【加群】即可加入终端研发部相关的技术交流群
阅读更多
用 Spring 的 BeanUtils 前,建议你先了解这几个坑!

lazy-mock ,一个生成后端模拟数据的懒人工具

在华为鸿蒙 OS 上尝鲜,我的第一个“hello world”,起飞!

字节跳动一面:i++ 是线程安全的吗?

一条 SQL 引发的事故,同事直接被开除!!

太扎心!排查阿里云 ECS 的 CPU 居然达100%

一款vue编写的功能强大的swagger-ui,有点秀(附开源地址)


相信自己,没有做不到的,只有想不到的在这里获得的不仅仅是技术!



喜欢就给个“在看”

以上是关于用了这么久线程池,你真的知道如何合理配置线程数吗?的主要内容,如果未能解决你的问题,请参考以下文章

资源池的两个小教训

你知道线程池创建多少线程比较合理吗?

【线程池】-4(合理配置线程池你是如何考虑的)

Java中线程池,你真的会用吗?

java线程池如何合理配置核心线程数

用了这么久的Log4j2日志框架,你真的理解吗?