动态线程池oneThread系统

基本概念

  1. 什么是线程池(Thread Pool)

    是一种基于池化思想管理线程的工具,线程池维护多个线程,等待管理者分配可并发执行的任务

  2. 线程池的作用

    • 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。
    • 提高响应速度:任务到达时,无需等待线程创建即可立即执行。
    • 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。
    • 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。
  3. 线程池解决的问题

    • 防止频繁申请/销毁资源和调度资源
    • 抑制对资源无限的申请
    • 合理管理内部的资源分布

Java中线程池的实现

Java线程池实现原理及其在美团业务中的实践

Java中的线程池核心实现类是ThreadPoolExecutor

运行流程

ThreadPoolExecutor运行流程

运行机制

维护线程池状态

通过AtomicInteger变量ctl来保存:

  • 运行状态(高3位)
  • 线程数量(后29位)

用一个变量去存储两个值,可避免在做相关决策时,出现不一致的情况,不必为了维护两者的一致,而占用锁资源

运行状态种类

运行状态 状态描述
RUNNING 能接受新提交的任务,并且也能处理阻塞队列中的任务。
SHUTDOWN 关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。
STOP 不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。
TIDYING 所有的任务都已终止了,workerCount (有效线程数) 为 0。
TERMINATED 在 terminated () 方法执行完后进入该状态。

执行任务

workerCount:当前线程数

corePoolSize:核心线程数(会被保留下来的线程数量)

maximumPoolSize:能存在的最大线程数

  1. workerCount < corePoolSize:创建线程来执行
  2. workerCount >= corePoolSize:放到阻塞队列里排队
  3. workerCount >= corePoolSize 且阻塞队列满了:创建新线程来执行
  4. 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系统/
作者
xw
发布于
2026年5月6日
许可协议