动态线程池oneThread系统
基本概念
什么是线程池(Thread Pool)
是一种基于池化思想管理线程的工具,线程池维护多个线程,等待管理者分配可并发执行的任务
线程池的作用
- 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。
- 提高响应速度:任务到达时,无需等待线程创建即可立即执行。
- 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。
- 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。
线程池解决的问题
- 防止频繁申请/销毁资源和调度资源
- 抑制对资源无限的申请
- 合理管理内部的资源分布
Java中线程池的实现
Java中的线程池核心实现类是ThreadPoolExecutor
运行流程

运行机制
维护线程池状态
通过AtomicInteger变量ctl来保存:
- 运行状态(高3位)
- 线程数量(后29位)
用一个变量去存储两个值,可避免在做相关决策时,出现不一致的情况,不必为了维护两者的一致,而占用锁资源
运行状态种类
| 运行状态 | 状态描述 |
|---|---|
| RUNNING | 能接受新提交的任务,并且也能处理阻塞队列中的任务。 |
| SHUTDOWN | 关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。 |
| STOP | 不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。 |
| TIDYING | 所有的任务都已终止了,workerCount (有效线程数) 为 0。 |
| TERMINATED | 在 terminated () 方法执行完后进入该状态。 |
执行任务
workerCount:当前线程数
corePoolSize:核心线程数(会被保留下来的线程数量)
maximumPoolSize:能存在的最大线程数
- workerCount < corePoolSize:创建线程来执行
- workerCount >= corePoolSize:放到阻塞队列里排队
- workerCount >= corePoolSize 且阻塞队列满了:创建新线程来执行
- workerCount >= corePoolSize 且阻塞队列满了,且workerCount >= maximumPoolSize:根据拒绝策略来处理该任务
拒绝任务策略
当阻塞队列满了 且 线程数达到最大值 时会触发拒绝策略
| 名称 | 描述 | |
|---|---|---|
| 1 | ThreadPoolExecutor.AbortPolicy | 丢弃任务并抛出 RejectedExecutionException 异常。是线程池默认的拒绝策略。 |
| 2 | ThreadPoolExecutor.DiscardPolicy | 丢弃任务,但是不抛出异常。 |
| 3 | ThreadPoolExecutor.DiscardOldestPolicy | 丢弃队列最前面的任务,然后重新提交被拒绝的任务。 |
| 4 | ThreadPoolExecutor.CallerRunsPolicy | 由调用线程(提交任务的线程)处理该任务。 |
工作线程Worker
有两个变量:
- thread:线程
- firstTask:执行的任务
如果是核心线程,会无限轮询获取任务;
如果是非核心线程,当无法获取到新任务时,轮询会结束,并主动消除在线程池里的引用,被JVM回收;
阻塞队列
要根据实际情况来选择
| 名称 | 描述 |
|---|---|
| ArrayBlockingQueue | 一个用数组实现的有界阻塞队列,此队列按照先进先出 (FIFO) 的原则对元素进行排序。支持公平锁和非公平锁。 |
| LinkedBlockingQueue | 一个由链表结构组成的有界队列,此队列按照先进先出 (FIFO) 的原则对元素进行排序。此队列的默认长度为 Integer.MAX_VALUE,所以默认创建的该队列有容量危险。 |
| PriorityBlockingQueue | 一个支持线程优先级排序的无界队列,默认自然序进行排序,也可以自定义实现 compareTo () 方法来指定元素排序规则,不能保证同优先级元素的顺序。 |
| DelayQueue | 一个实现 PriorityBlockingQueue 实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素。只有延时期满后才能从队列中获取元素。 |
| SynchronousQueue | 一个不存储元素的阻塞队列,每一个 put 操作必须等待 take 操作,否则不能添加元素。支持公平锁和非公平锁。SynchronousQueue 的一个使用场景是在线程池里。Executors.newCachedThreadPool () 就使用了 SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程空闲了 60 秒后会被回收。 |
| LinkedTransferQueue | 一个由链表结构组成的无界阻塞队列,相当于其它队列,LinkedTransferQueue 队列多了 transfer 和 tryTransfer 方法。 |
| LinkedBlockingDeque | 一个由链表结构组成的双向阻塞队列。队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。 |
线程池的使用场景
场景1:快速响应用户请求
一个网页有多个数据需要查询时,可用线程池并行查询;
这种场景重要的响应速度,所以应不设置阻塞队列;
场景2:快速处理批量任务
离线的大量计算任务;
目标是尽可能在单位时间内处理更多的任务,并不需要瞬时的完成,因此需要设置阻塞队列;
动态线程池oneThread系统
http://xwww12.github.io/2026/05/06/后端/动态线程池oneThread系统/