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

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

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

源码精品专栏

  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:lixinkuan.blog.csdn.net/

article/details/94501073

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

  • 二、自定义线程池

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


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

(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。



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

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

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

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

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

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

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

  1. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

    文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...

  2. 工作中如何使用线程池的?自己如何定义一个线程池?

    工作中如何使用线程池的?自己如何定义一个线程池? import java.util.concurrent.*;public class MyThreadPoolDemo {public static ...

  3. java 线程池 状态_【Java多线程】线程状态、线程池状态

    线程状态: 线程共包括以下5种状态. 1. 新建状态(New)线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable)也 ...

  4. winform判断线程有没有完成_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  5. java socket 线程池_程序员:java使用线程池和TCP实现简单多轮聊天系统

    最近在做物联网项目,需要使用TCP和传感器进行双向交互,通过这种渠道,找到了下面的代码,写成博客主要也是为了记录一下,以后用到随时可以看. 代码实现 服务端 package com.tcp; impo ...

  6. java如何关闭线程池_如何优雅的关闭Java线程池

    ⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...

  7. 项目使用线程池_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  8. [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]

    场景 1.C++标准库没有提供线程池操作, 连Win32都没有集成线程池, 相比之下macOS完善多了, 至少有operations. 多线程在执行多任务时有很大优势, 比如同时管理多个设备, 多个s ...

  9. spring线程池 java_Java 中几种常用的线程池

    概述: 在java内置API中操作线程所用到的类为Thread.创建线程一般有两种方式, 继承Thread方式 实现Runnable方式,并以runnable作为target创建Thread 在And ...

最新文章

  1. 今晚直播 | 基于知识图谱的人机对话系统方法与实践
  2. opencv补全边缘_为什么OpenCV中绘制的轮廓不能填充图像边缘的轮廓?
  3. PHP——PHP读取MySQL数据库中文乱码解决方案
  4. 以“百钱买百鸡”问题练习使用 C语言 goto 语句
  5. 最好免费的 HTML5 JS 网站视频播放器收集
  6. Python细节面试题--小整数对象池和大整数对象池
  7. HIVE Sql 笛卡尔积关联导致查询过慢问题优化
  8. win10热点 ip配置失败
  9. vivo S7e和华为nova8se 的区别 哪个好
  10. 企业如何借助制造业ERP系统,做好生产排产管理?
  11. java apex_Apex基础知识(一)
  12. Windows编程 Windows程序的生与死(下)
  13. python利用jieba实现中文分词
  14. Android端WebRTC本地音视频采集流程源码分析
  15. 押宝ACE平台 北电自救或转身服务型公司
  16. 停车还能360全方位影像_新款途锐2.0版、3.0版均能升级的原厂360全景影像及盲点辅助系统...
  17. mysql zip 版本_MySQL zip版本安装
  18. C#的多线程(2)之二
  19. ppt文件被加密怎么解开,ppt复制打印限制怎么解除?
  20. Maxwell简介、部署、原理和使用介绍

热门文章

  1. h2 database mysql_H2 database的使用
  2. Java获取Json中的数据
  3. Linux查看网关命令
  4. 偏心率(离心率)、半径、直径
  5. 转转闲鱼链接源码搭建+后台管理
  6. 分页查询——RowBounds的使用
  7. 软件测试面试linux笔试题及答案,软件测试人员面试笔试题及答案
  8. RAID0、1、3、5、6、10、50和热备盘超详细说明
  9. Python音频特征提取——pyAudioAnalysis工具包
  10. 局域网内计算机ping不通的解决(主要是记一下命令)