cachedthreadpool适合短时高并发任务,无核心线程、按需创建、60秒空闲销毁,依赖synchronousqueue不缓存任务;fixedthreadpool线程数固定、全为核心线程、任务排队等待,资源稳定但可能堆内存溢出。

CachedThreadPool适合短时高并发任务
它没有核心线程,初始为0,任务来一个就新建一个线程执行;线程空闲满60秒自动销毁。底层用的是SynchronousQueue,这个队列不存任务,只做“交接”,所以新任务无法排队,只能立刻创建线程或复用空闲线程。适合处理大量突发性、执行时间很短的任务,比如Web请求响应、日志采集等。
FixedThreadPool强调稳定可控的并发量
你指定多少个线程,它就始终保持多少个——全是核心线程,不会扩容也不会缩容。任务多了就进无界队列排队等待,不会新建线程。这意味着资源占用可预期,系统压力平稳。适合长期运行、耗时相对均匀的服务,比如后台定时同步、数据库批量写入等。
两者在资源与风险上的关键差异
内存与线程开销不同:CachedThreadPool可能短时间内创建成百上千线程,若任务持续涌入且未及时完成,容易OOM;FixedThreadPool线程数固定,内存占用稳定,但队列积压过多可能撑爆堆内存(尤其用LinkedBlockingQueue默认容量Integer.MAX_VALUE)。
拒绝策略表现不同:CachedThreadPool几乎不会触发拒绝策略(除非系统资源彻底耗尽),而FixedThreadPool在队列满+线程全忙时,会按默认策略(AbortPolicy)直接抛出RejectedExecutionException。
适用节奏不同:前者响应快、弹性好,但“野”;后者节奏稳、易监控,但不够灵活。
选型建议看实际负载特征
– 如果任务像“暴雨”:瞬间涌来、几毫秒就完,选CachedThreadPool
– 如果任务像“流水线”:持续不断、每个耗时几百毫秒到几秒,选FixedThreadPool
– 如果不确定或混合场景,建议绕过Executors工厂方法,直接用ThreadPoolExecutor构造,自行配置核心/最大线程数、队列类型、拒绝策略和存活时间,把控制权真正握在手里
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











