Java 线程池详解

Java 线程池详解
从原理到实战,全面掌握线程池核心技能

一、线程池核心原理

提交任务

线程池

任务队列
workQueue

核心线程1

核心线程2

核心线程N

临时线程1

临时线程2

任务

线程池 = 任务队列 + 工作线程

组件作用
任务队列缓存待执行任务
工作线程从队列取任务执行
线程管理控制线程数量、回收空闲线程

二、线程池处理流程

提交任务

线程数 < corePoolSize?

创建新线程

队列已满?

执行任务

加入队列等待

线程数 < maximumPoolSize?

创建临时线程

触发拒绝策略

拒绝任务

执行流程:

  1. 线程数 < corePoolSize → 创建新线程执行
  2. 线程数 >= corePoolSize → 任务加入队列
  3. 队列满 + 线程数 < maximumPoolSize → 创建临时线程
  4. 队列满 + 线程数 = maximumPoolSize → 拒绝任务

三、线程池 7 大参数

newThreadPoolExecutor(int corePoolSize,// 1. 核心线程数int maximumPoolSize,// 2. 最大线程数long keepAliveTime,// 3. 空闲线程存活时间TimeUnit unit,// 4. 时间单位BlockingQueue<Runnable> workQueue,// 5. 任务队列ThreadFactory threadFactory,// 6. 线程工厂RejectedExecutionHandler handler // 7. 拒绝策略);
参数说明示例值
corePoolSize核心线程数,常驻线程数10
maximumPoolSize最大线程数,弹性扩展上限50
keepAliveTime空闲线程存活时间60
unit时间单位TimeUnit.SECONDS
workQueue任务队列new ArrayBlockingQueue<>(100)
threadFactory线程创建工厂Executors.defaultThreadFactory()
handler拒绝策略new ThreadPoolExecutor.AbortPolicy()

四、任务队列选择

队列类型特点适用场景
ArrayBlockingQueue有界队列,需指定容量限流场景
LinkedBlockingQueue无界队列,默认 Integer.MAX_VALUE任务堆积风险
SynchronousQueue无容量,直接交付快速响应场景
DelayedWorkQueue延迟队列定时任务
// 有界队列(推荐)newArrayBlockingQueue<>(100)// 无界队列(谨慎使用)newLinkedBlockingQueue<>()// 同步队列(适合耗时短的任务)newSynchronousQueue<>()

五、拒绝策略

策略行为适用场景
AbortPolicy抛异常默认,需业务处理
CallerRunsPolicy调用者线程执行缓冲压力,慎用
DiscardPolicy静默丢弃日志等非核心任务
DiscardOldestPolicy丢弃最老任务优先处理新任务
// 默认:抛异常newAbortPolicy()// 调用者执行newCallerRunsPolicy()// 丢弃任务newDiscardPolicy()// 丢弃最老任务newDiscardOldestPolicy()

六、线程工厂

ThreadFactory factory =newThreadFactory(){privateAtomicInteger count =newAtomicInteger(1);@OverridepublicThreadnewThread(Runnable r){Thread thread =newThread(r); thread.setName("MyThread-"+ count.getAndIncrement()); thread.setDaemon(false);// 非守护线程return thread;}};

常用配置:

  • 线程命名
  • 守护线程设置
  • 线程优先级

七、Executors 工具类

方法说明风险
newFixedThreadPool(n)固定 n 线程无界队列,OOM
newSingleThreadExecutor()单线程无界队列,OOM
newCachedThreadPool()弹性扩展最大 Integer.MAX_VALUE
newScheduledThreadPool(n)定时任务无界队列,OOM

阿里巴巴规范:不推荐使用!

// 不推荐:可能 OOMExecutorService pool =Executors.newFixedThreadPool(10);// 推荐:手动配置ExecutorService pool =newThreadPoolExecutor(10,50,60L,TimeUnit.SECONDS,newArrayBlockingQueue<>(100),newThreadPoolExecutor.AbortPolicy());

八、线程池状态

创建

shutdown()

shutdownNow()

队列空 + 无活跃线程

无活跃线程

terminated()执行完毕

RUNNING

SHUTDOWN

STOP

TIDYING

TERMINATED

状态说明
RUNNING111接收新任务,执行任务
SHUTDOWN000不接收新任务,执行已提交任务
STOP001不接收新任务,不执行已提交任务
TIDYING010任务执行完毕,准备终止
TERMINATED011完全终止

九、实战配置

1. CPU 密集型任务

// CPU 核心数 + 1int cpuCores =Runtime.getRuntime().availableProcessors();newThreadPoolExecutor( cpuCores +1, cpuCores +1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<>(1000));

2. IO 密集型任务

// CPU 核心数 * 2int cpuCores =Runtime.getRuntime().availableProcessors();newThreadPoolExecutor( cpuCores *2, cpuCores *2,60L,TimeUnit.SECONDS,newLinkedBlockingQueue<>(1000));

3. 混合型任务

newThreadPoolExecutor( cpuCores +1, cpuCores *2,60L,TimeUnit.SECONDS,newArrayBlockingQueue<>(500));

十、线程池监控

1. 常用监控方法

ThreadPoolExecutor executor =newThreadPoolExecutor(...);// 活跃线程数 executor.getActiveCount();// 队列任务数 executor.getQueue().size();// 已完成任务数 executor.getCompletedTaskCount();// 总任务数 executor.getTaskCount();// 线程池是否Terminated executor.isTerminated();

2. 线程池监控示例

publicclassThreadPoolMonitor{publicstaticvoidprintStatus(ThreadPoolExecutor executor){System.out.println("====================");System.out.println("线程池大小: "+ executor.getPoolSize());System.out.println("活跃线程数: "+ executor.getActiveCount());System.out.println("队列任务数: "+ executor.getQueue().size());System.out.println("已完成任务: "+ executor.getCompletedTaskCount());System.out.println("总任务数: "+ executor.getTaskCount());System.out.println("====================");}}

十一、优雅关闭线程池

ThreadPoolExecutor executor =newThreadPoolExecutor(...);// 1. 拒绝新任务 executor.shutdown();// 2. 等待任务完成(带超时)if(!executor.awaitTermination(60,TimeUnit.SECONDS)){// 3. 强制中断 executor.shutdownNow();}// 或者直接暴力关闭 executor.shutdownNow();

关闭原则:

  1. shutdown() 拒绝新任务
  2. 等待任务完成或超时
  3. 超时后 shutdownNow() 强制中断

十二、常见问题

1. 线程池参数设置多大?

任务类型推荐线程数
CPU 密集型CPU 核心数 + 1
IO 密集型CPU 核心数 * 2
混合型CPU 核心数 + 1 ~ CPU 核心数 * 2

2. 队列容量设置多大?

// 经验公式 队列容量 = 核心线程数 * 期望响应时间(秒)*2

3. 线程池会 OOM 吗?

会!常见原因:

  • LinkedBlockingQueue 无界队列堆积
  • 任务过多且执行慢
  • 拒绝策略不合理

解决:

  • 使用有界队列
  • 合理设置 maximumPoolSize
  • 监控队列大小

4. 核心线程会被回收吗?

默认不会!设置允许回收:

executor.allowCoreThreadTimeOut(true);

十三、总结

线程池核心

参数配置
core/max/queue

队列选择
Array/Linked/Synchronous

拒绝策略
4种策略

监控与调优

合理配置
避免 OOM

优雅关闭
防止任务丢失

核心要点:

要点说明
参数配置根据任务类型选择 core/max/queue
队列选择优先使用有界队列
拒绝策略根据业务选择合适的策略
监控定期监控队列大小、活跃线程数
关闭先 shutdown 再 awaitTermination

Read more

OpenClaw多智能体路由实战:飞书多机器人配置指南

文章目录 * 飞书重新安装问题 * 批量增加机器人 * 缺点 * 多个飞书机器人名称包含大小写的问题 * 多个Agent名称包含大小写的问题 目前我已经完成了OpenClaw的基本安装,但是在对话框只有一个,机器人也只绑定到主会话,一次只能处理一个消息。很多时候我在聊天窗口,说A任务,然后做了一半,又发了关于B任务的指令。一是每次发完消息,如果OpenClaw还在处理,剩下的消息要么进入队列、要么看不到(实际还在队列)。两个任务切来切去,感觉体验很不好。 要彻底解决这个问题,实现网上演示的那种对各Agent、每个对话机器人对应一个Agent,就需要用到多智能体路由技术。 实现的步骤如下: * 在飞书创建一个新的机器人 * 通过控制台创建新的智能体 * 按照指引将飞书配置上去 * 根据需要创建多个Agent和机器人,并对应配置上去(略) 飞书重新安装问题 明明我已经安装好了飞书,系统还是会提示我安装,否则就跳过了添加飞书这步。应该是系统Bug。这次安装的飞书位置在~/.openclaw/extensions/feishu,其实和~/.npm-globa

By Ne0inhk

电商客服机器人实战:SGLang+DeepSeek快速落地

电商客服机器人实战:SGLang+DeepSeek快速落地 1. 为什么电商客服需要SGLang这样的推理框架? 你有没有遇到过这样的场景:大促期间,客服咨询量暴增3倍,人工坐席全在线仍排队200+,用户等5分钟没回复直接关页面?或者,刚上线的AI客服回答“订单状态”还行,但一问“能不能把这件T恤换成同款蓝色,差价我补”,就卡壳说“我正在学习中”? 这不是模型能力不行,而是传统部署方式拖了后腿。 很多团队用vLLM或Ollama跑DeepSeek,结果发现: * 多轮对话时,每轮都重算前面所有token,GPU显存吃紧,吞吐掉一半; * 想让模型返回标准JSON格式(比如{"action": "exchange", "sku": "DS-2024-BLUE", "refund": 12.5}),得靠后处理正则清洗,出错率高还慢; * 写个“先查订单→

By Ne0inhk

WIN11必备!QTTabBar中文优化版保姆级安装教程(含常见问题解决)

WIN11效率革命:深度定制你的资源管理器,不止于多标签 如果你和我一样,每天要在Windows的资源管理器里花费大量时间,那你一定对那种反复在层层文件夹中穿梭、找不到上一个窗口的体验深恶痛绝。系统自带的文件管理工具,就像一个功能简陋的毛坯房,勉强能用,但毫无效率与舒适度可言。尤其是升级到WIN11后,虽然界面更现代,但核心的文件管理逻辑依然停留在上个时代,对于追求效率的用户来说,这无疑是一种巨大的生产力损耗。 这篇文章,就是为那些不愿忍受现状,但又不想投入过多精力去学习复杂新软件的WIN10/WIN11用户准备的。我们不讨论那些需要彻底改变操作习惯的“重型”第三方管理器,而是聚焦于一种更优雅、更无感的解决方案:增强你正在使用的资源管理器本身。今天的主角,是一个经过国内开发者精心“魔改”的经典工具——QTTabBar的中文优化版。它就像给你的文件管理器做了一次精装修,保留了熟悉的格局,却赋予了它全新的、高效的能力。接下来,我将带你从零开始,完成这次效率升级,并深入探讨如何根据你的习惯,将它调校成最趁手的工具。 1. 为什么选择增强,而非替换? 在深入安装细节之前,我们有必要先

By Ne0inhk
原创大规模无人机检测数据集:11998张高质量图像,支持YOLOv8、COCO、TensorFlow多格式训练,涵盖飞机、无人机、直升机三大目标类别

原创大规模无人机检测数据集:11998张高质量图像,支持YOLOv8、COCO、TensorFlow多格式训练,涵盖飞机、无人机、直升机三大目标类别

大规模无人机检测数据集:11998张高质量图像,支持YOLOv8、COCO、TensorFlow多格式训练,涵盖飞机、无人机、直升机三大目标类别 引言与背景 随着无人机技术的快速发展和广泛应用,无人机检测已成为计算机视觉领域的重要研究方向。无论是民用领域的无人机监管、安全防护,还是军用领域的威胁识别、防空系统,都需要高精度的无人机检测算法作为技术支撑。然而,构建一个高质量、大规模、多场景的无人机检测数据集面临着数据收集困难、标注成本高昂、场景多样性不足等挑战。 本数据集正是在这一背景下应运而生,为无人机检测研究提供了宝贵的数据资源。该数据集不仅包含了丰富的无人机图像样本,还涵盖了飞机和直升机等相似目标,为算法训练提供了更具挑战性和实用性的数据环境。通过多格式标注支持,研究人员可以直接使用该数据集进行YOLOv8、TensorFlow Object Detection等主流框架的模型训练,大大降低了研究门槛,加速了无人机检测技术的发展。 数据基本信息 项目详细信息图像总数11,998张图像分辨率640×640像素目标类别3类(飞机、无人机、直升机)标注格式COCO JSON

By Ne0inhk