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

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:lixinkuan.blog.csdn.net/

article/details/94501073


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

(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个线程数

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

二、自定义线程池

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();
        }
    }
}

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

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

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

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

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

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

57d194a94f7a68c81028edb45e9f15d3.png

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

028fe07c42969f1830ca0ea7f2b1109f.png

已在知识星球更新源码解析如下:

cf9d790a440fbe508c0fd46cb820059c.png

38369ea6793e474296e6041617ccf7fd.png

87997d0afaf27a62cc3e4a4c164edfe6.png

1760597f13256fc6ffbdf1213964af4f.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值