线程池原理梳理

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.源码解析

      各线程状态

  1. RUNNING(运行)
    • 表示线程池处于正常运行状态,可以接受新任务并处理队列中的任务。
    • 当线程池被创建并启动后,默认处于RUNNING状态。
    • 在这个状态下,线程池会处理所有提交的任务,包括新任务和队列中的任务。
  2. SHUTDOWN(关闭)
    • 表示线程池不再接受新任务,但会继续处理队列中的任务。
    • 当调用shutdown()方法时,线程池会进入SHUTDOWN状态。
    • 在这个状态下,线程池会拒绝新任务的提交,但会继续执行已经提交的任务,直到队列为空。
  3. STOP(停止)
    • 表示线程池不再接受新任务,不再处理队列中的任务,并尝试中断正在执行的任务。
    • 当调用shutdownNow()方法时,线程池会进入STOP状态。
    • 在这个状态下,线程池会尝试停止所有正在执行的任务,并忽略队列中等待的任务。
  4. TIDYING(整理)
    • 表示所有任务都已终止,线程池中的线程数量为0,即将进入TERMINATED状态。
    • 当线程池在SHUTDOWN或STOP状态下,所有任务已终止并且线程池中的线程数量为0时,线程池会进入TIDYING状态。
    • 在这个状态下,线程池会进行一些清理工作,比如调用terminated()方法(如果该方法被覆盖的话)。
  5. 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); 
}

这里先熄火

posted @   辉辉、  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示