一、线程池线程池 存放多个线程的 “池子”。程序需要执行任务时直接从池子里借一个线程任务执行完线程不销毁放回池子复用。线程池的作用避免频繁创建 / 销毁线程非常耗资源控制并发线程数量防止服务器卡死统一管理线程监控、调优、拒绝策略线程池 线程复用 控制并发 资源管理Java 内置线程池的核心工具ExecutorService—— 线程池接口ThreadPoolExecutor—— 线程池真正实现类最常用二、线程池 7 大核心参数new ThreadPoolExecutor( int corePoolSize, // 核心线程数常驻线程 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 非核心线程空闲多久被销毁 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 任务队列 ThreadFactory threadFactory, // 线程工厂命名线程 RejectedExecutionHandler handler // 拒绝策略 )执行流程超级重要任务进来 → 核心线程未满 → 创建核心线程执行核心线程满了 → 任务放进队列排队队列满了 → 创建非核心线程执行总线程达到最大 → 执行拒绝策略三、最常用的 4 种线程池简单好用Java 通过Executors工具类快速创建1.FixedThreadPool固定线程数适合已知并发压力的任务ExecutorService pool Executors.newFixedThreadPool(5);2. CachedThreadPool自动扩容适合大量短生命周期任务ExecutorService pool Executors.newCachedThreadPool();3.ScheduledThreadPool定时任务适合定时、周期性执行任务ScheduledExecutorService pool Executors.newScheduledThreadPool(3);4.SingleThreadExecutor单线程适合需要顺序执行的任务ExecutorService pool Executors.newSingleThreadExecutor();四、拒绝策略线程满了怎么办4 种内置策略AbortPolicy默认直接抛异常CallerRunsPolicy让提交任务的线程自己执行DiscardPolicy直接丢掉任务DiscardOldestPolicy丢掉队列最老的任务真实开发常用CallerRunsPolicy最安全五、线程池大小如何设置CPU 密集型核心数 1IO 密集型核心数 * 2或更多因为 IO 会等待例4 核 CPU计算任务 → 核心线程 5网络 / 数据库 → 核心线程 8~10六、生产环境最佳线程池配置1. 核心原则禁止Executors快捷创建直接手动ThreadPoolExecutor实例化规避 OOM 风险按业务类型区分线程池隔离任务互不影响。2. 参数取值规范参数IO 密集型CPU 密集型说明核心线程CPU 核数 ×2CPU 核数 1常驻核心保障基础吞吐最大线程核心 ×4等于核心IO 可扩容应对突发峰值空闲存活60s0s闲置线程及时回收节省资源阻塞队列ArrayBlockingQueue(200)固定队列 100有界队列杜绝无限堆积 OOM线程工厂自定义命名自定义命名便于日志排查问题拒绝策略CallerRunsPolicyCallerRunsPolicy不丢任务降级由调用方执行3. 队列选型ArrayBlockingQueue有界队列固定容量生产首选可控内存禁用SynchronousQueue、无界LinkedBlockingQueue极易引发内存溢出4. 拒绝策略选型生产首选CallerRunsPolicy优势不会丢弃业务任务削峰限流保护服务禁用默认 AbortPolicy 频繁抛异常、Discard 系列丢失数据5. 生产运维要点线程池拆分业务、定时、异步消息各自独立池避免互相阻塞监控埋点监控线程活跃数、队列积压、拒绝次数、执行耗时优雅关闭应用下线调用shutdown()等待任务收尾动态调参压测后根据实际 QPS、耗时微调核心数与队列大小6. 避坑总结不使用 Executors 创建线程池队列必须设固定上限业务分类隔离线程池自定义线程名方便问题定位拒绝策略优先调用者执行保障数据不丢失