线程池任务处理按“核心线程创建→队列入队→非核心线程扩容→拒绝策略”动态决策。先判活动线程数是否小于corepoolsize,是则新建核心线程;否则尝试入队;失败且总线程数小于maximumpoolsize则建非核心线程;否则触发拒绝策略。

任务提交后,线程池不是按固定顺序“排队→扩容→拒绝”,而是一套基于实时状态的动态决策链。整个流转由当前工作线程数、队列容量和最大线程数三者协同判断,每一步都依赖即时条件。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
核心线程优先创建,空闲也不跳过
调用 execute() 提交任务时,线程池第一件事是检查当前活动线程数是否小于 corePoolSize: - 是 → 立即新建一个核心线程执行该任务,不管有没有空闲核心线程 - 否 → 进入下一步判断 这个设计确保核心线程能快速“热启动”,避免空等浪费资源
队列入队失败才考虑扩容
当核心线程已满,线程池尝试将任务加入 workQueue: - 入队成功 → 任务等待空闲线程从队列中 take() 执行(核心线程会无限阻塞等待) - 入队失败(如队列满、SynchronousQueue 无等待消费者)→ 进入下一步 注意:这里存在二次校验——入队后还会再检查线程池是否仍为 RUNNING 状态,防止状态变更导致任务丢失
非核心线程只在高水位时临时补充
队列已满且当前总线程数仍小于 maximumPoolSize 时: - 新建一个非核心线程,直接执行当前任务(不进队列) - 该线程空闲超过 keepAliveTime 后自动销毁,使线程数回落到 corePoolSize - 核心线程默认永驻,除非显式设置 allowCoreThreadTimeOut(true)
拒绝策略是最后兜底,不是异常分支
当队列满 + 当前线程数已达 maximumPoolSize,新任务无法接纳: - 触发 RejectedExecutionHandler,按配置策略处理 - 默认 AbortPolicy:抛出 RejectedExecutionException - CallerRunsPolicy:由提交任务的线程自己执行,可缓解压力但可能阻塞调用方 - DiscardPolicy:静默丢弃 - DiscardOldestPolicy:丢弃队列头任务,再尝试提交当前任务
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










