线程池相关问题

  1. 核心思想

应用池化思想,减少线程重复创建和销毁的消耗,提升性能

  1. 核心参数

核心线程数、最大线程数、非核心线程空闲回收时间、时间单位、阻塞队列、拒绝策略、线程工厂

  • 可以通过设置allowCoreThreadTimeout = true来让核心线程空闲回收,适用的空闲回收策略和非核心线程相同,复用同样的超市时间
  • 基建比较好的公司一般还提供了线程数、阻塞队列容量和长度监控和动态调整的能力。
  1. 线程数的选择

最佳实践:单机QPS/单线程每秒处理的任务个数

例如接口单机QPS为100,任务平均执行时间为200ms,那么单线程每秒处理的任务个数为5个,那么线程数设置在20左右合适。

  1. 阻塞队列类型和长度的选择

**同步队列:**当任务数较多,且流量比较平缓,比如QPS在800~1000之间波动,线程数足够的情况下,推荐使用同步队列

**阻塞队列:**当任务数不固定,波动明显,比如QPS在10~1000之间波动,这时可以使用阻塞队列

**推荐:**高流量,线程数配置足够,使用同步队列;低流量,线程数配够,使用阻塞队列。且 阻塞队列数> max(200,线程数*3),如果任务数波动较大,阻塞队列配置1000+是很正常的情况

| 队列 | 有界/无界 | 是否公平 | 锁机制 | 适用场景 |
| LinkedBlockingQueue | 可有界可无界 | 否 | 双锁(读写分离) | 最常用,通用场景,双锁性能好 |
| ArrayBlockingQueue | 有界 | 可选 | 单锁 | 公平锁场景,性能略比LinkedBlockingQueue差一点 |
| SynchronousQueue | 无容量 | 可选 | CAS | 线程直传,快速响应。因为阻塞队列长度为0,所以线程数量需要设置的足够大,否则会拒绝任务 |
| PriorityBlockingQueue | 无界 | 按优先级 | 单锁+堆 | 任务有优先级 |

DelayQueue 无界 按延迟时间 单锁 延迟/定时任务
  1. 拒绝策略的选择
  • CallerRunsPolicy

谁提交,谁执行,用于反压主线程,自动调节任务提交速度

  • AbortPolicy

丢弃任务,抛出RejectedExecutionException异常

  • DiscardPolicy

丢弃任务

  • DiscardOldestPolicy

丢弃最早的任务

相关推荐
代码山河3 小时前
Java的前世今生:从Oak语言到Java 23的发展史
java·学习·架构·教程·面向对象·项目
新鲜势力呀3 小时前
PHP 文件上传系统实战:从上传卡顿到分片上传 + 秒传 + 云存储架构完整优化方案
开发语言·架构·php
vx_Biye_Design3 小时前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
李游Leo3 小时前
HarmonyOS 7 QuickDock 闪控窗开发实录 02:floatView × floatingBall:形态切换、位置恢复与单一状态源【鸿蒙心迹】
java·华为·harmonyos
企业数字化笔记3 小时前
视频局部合成怎么做得自然?掩膜修复、边缘羽化、时序稳定与背景替换
java·javascript·音视频
仍然.3 小时前
Redis---主从复制
java·数据库·redis
vx_Biye_Design3 小时前
springboot咖啡厅顾客点单管理系统12080-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
QQ_21696290963 小时前
基于微信小程序的智能膳食分析系统
java·大数据·spring boot·微信小程序·小程序·旅游
程序员老陆3 小时前
从语法糖到类型系统:深度拆解 C++ Lambda 与可调用对象的“血缘关系”
开发语言·c++·程序设计
(Charon)3 小时前
【C++面试】设计模式:手写单例模式与工厂模式
开发语言·c++