线程池excute方法执行流程
1 // 线程池execute方法执行流程 2 public void execute(Runnable command) { 3 // 非空判断,判断提交的任务是否为空 4 if (command == null) 5 throw new NullPointerException(); 6 // 获取ctl属性 7 int c = ctl.get(); 8 // 工作线程个数是否小于核心线程数 9 if (workerCountOf(c) < corePoolSize) { 10 // 添加一个核心线程 11 if (addWorker(command, true)) 12 // 添加核心线程成功,返回true,直接return结束 13 return; 14 // 如果在并发情况下,添加核心线程失败的线程,需要重新获取一次ctl属性 15 c = ctl.get(); 16 } 17 // 创建核心线程失败 18 // 判断当前线程池状态是否为running 19 // 如果是RUNNING,执行offer方法将任务添加到工作队列 20 if (isRunning(c) && workQueue.offer(command)) { 21 // 添加任务到工作队列成功 22 // 再次获取ctl 23 int recheck = ctl.get(); 24 // 线程池是否为RUNNING状态,如果不是RUNNING状态,需要将任务从工作队列移除 25 if (! isRunning(recheck) && remove(command)) 26 // 线程池状态不正确,执行拒绝策略 27 reject(command); 28 // 是RUNNING状态,判断工作线程是否为0 29 else if (workerCountOf(recheck) == 0) 30 // 工作线程数为0,但是工作队列中有任务在排队 31 // 添加一个空任务非核心线程,为了处理在工作队列中排队的任务 32 // 线程为SHUTDOWN的时候,需要工作线程数为0并且工作队列为空才能转换成过渡状态,最后才能销毁线程 33 // 我们创建一个任务为空的非核心线程去执行工作队列中还没处理的任务,才能保证线程状态切换不出现问题。 34 addWorker(null, false); 35 } 36 // 任务添加到工作队列失败,尝试创建非核心线程去执行当前任务 37 else if (!addWorker(command, false)) 38 // 添加非核心线程失败,会执行reject拒绝策略 39 reject(command); 40 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现