线程池原理梳理
1.参数说明
acc:上下文
corePoolSize:核心工作线程
maximumPoolSize:最大工作数量线程,包含了核心工作线程
keepAliveTime:非核心线程最大空闲回收时间
TimeUnit:指定keepAliveTime时间单位
workQueue:工作队列。如事件都让可用的线程处理了,就需要压入工作队列缓冲一下。
ThreadFactory:线程创建工厂
Handler:拒绝策略
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
2.源码解析
各线程状态
- RUNNING(运行):
- 表示线程池处于正常运行状态,可以接受新任务并处理队列中的任务。
- 当线程池被创建并启动后,默认处于RUNNING状态。
- 在这个状态下,线程池会处理所有提交的任务,包括新任务和队列中的任务。
- SHUTDOWN(关闭):
- 表示线程池不再接受新任务,但会继续处理队列中的任务。
- 当调用
shutdown()
方法时,线程池会进入SHUTDOWN状态。 - 在这个状态下,线程池会拒绝新任务的提交,但会继续执行已经提交的任务,直到队列为空。
- STOP(停止):
- 表示线程池不再接受新任务,不再处理队列中的任务,并尝试中断正在执行的任务。
- 当调用
shutdownNow()
方法时,线程池会进入STOP状态。 - 在这个状态下,线程池会尝试停止所有正在执行的任务,并忽略队列中等待的任务。
- TIDYING(整理):
- 表示所有任务都已终止,线程池中的线程数量为0,即将进入TERMINATED状态。
- 当线程池在SHUTDOWN或STOP状态下,所有任务已终止并且线程池中的线程数量为0时,线程池会进入TIDYING状态。
- 在这个状态下,线程池会进行一些清理工作,比如调用
terminated()
方法(如果该方法被覆盖的话)。
- TERMINATED(终止):
- 表示线程池已经完全终止,不再处理任何任务。
- 当线程池在TIDYING状态下完成所有清理工作后,会进入TERMINATED状态。
- 这个状态是线程池的最终状态,表示线程池已经完全停止并释放了所有资源。
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
//是AtomicInteger 32位
//3位用于表示状态,后29位用于表示线程数
int c = ctl.get();
//工作线程数量 < 核心线程数
if (workerCountOf(c) < corePoolSize) {
//创建核心线程
if (addWorker(command, true))
return;
c = ctl.get();
}
//线程池 - 运行状态 并且 将任务插入到工作队列(必须成功)才走下面逻辑
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
//高并发时,线程执行时间片较短,可能出现压入工作队列后线程池状态有变化
//需要删除线程任务
if (!isRunning(recheck) && remove(command))
//执行拒绝策略
reject(command);
else if (workerCountOf(recheck) == 0) //如果工作线程=0,则添加非核心线程
//添加不执行具体任务的非核心线程
addWorker(null, false);
}
else if (!addWorker(command, false)) //添加非核心线程
//执行拒绝策略
reject(command);
}
这里先熄火
每天坚持,终会抵达!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了