第17篇:Java线程池超全详解,七大核心参数、四种常用线程池、拒绝策略、底层原理、生产实战规范 前面我们学完了多线程创建方式、锁机制、volatile、线程通信。但是开发中绝对禁止手动 new Thread()。为什么频繁创建、销毁线程开销极大、无法控制并发数量、容易OOM内存溢出、系统崩溃。所以官方统一规范所有多线程业务统一使用线程池本篇是多线程最终终章也是面试最高频、工作最常用的一篇。我带你吃透线程池底层思想、七大核心参数、四种线程池、四大拒绝策略、线程池工作流程、生产规范。零基础一次性学通透。本篇核心学习目标理解线程池核心作用与优势死磕线程池七大核心参数面试必考掌握四种常用内置线程池使用场景吃透四大拒绝策略原理看懂线程池完整工作流程掌握生产环境线程池实战规范搞定线程池所有面试题一、什么是线程池为什么必须用线程池1.1 线程池通俗理解线程池提前创建好一批线程放入池中统一管理任务来了直接复用任务结束线程不销毁循环复用。生活类比手动new线程 临时招工干完活立刻辞退反复招人开销极大线程池 固定员工团队任务来了直接干活永久复用1.2 线程池四大核心优势必背降低资源消耗避免频繁创建、销毁线程节省CPU内存提高响应速度任务到达无需新建线程直接复用统一管理线程可控并发数、防止无限创建线程导致OOM可拓展性强支持延迟、定时、拒绝策略、任务排队二、线程池七大核心参数全篇最重要、面试必背Java线程池核心类ThreadPoolExecutor所有线程池底层都是它七大参数缺一不可。public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲超时时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 任务阻塞队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 )2.1 七大参数通俗详解corePoolSize 核心线程数常驻线程永远不销毁随时待命maximumPoolSize 最大线程数线程池能容纳的最大线程总量keepAliveTime 空闲存活时间非核心线程空闲超时自动销毁unit 时间单位毫秒、秒、分钟等workQueue 阻塞队列任务太多线程处理不过来存入队列排队threadFactory 线程工厂负责创建线程、设置线程名、优先级handler 拒绝策略队列满、线程爆满触发任务拒绝规则三、线程池完整工作流程面试高频我用大白话梳理线程池执行任务的完整流程一步不差任务提交判断核心线程数是否已满未满 → 创建核心线程执行任务核心线程已满 → 判断阻塞队列是否已满未满 → 任务入队排队队列已满 → 判断最大线程数是否已满未满 → 创建非核心线程执行任务最大线程数也满 →触发拒绝策略任务执行完毕非核心线程空闲超时自动回收核心线程常驻复用核心顺序核心线程 → 队列 → 非核心线程 → 拒绝策略四、四种内置线程池ExecutorsJDK自带四种常用线程池封装好参数开箱即用。4.1 四种线程池特点与场景线程池类型特点适用场景newCachedThreadPool无核心线程、最大线程无限、空闲60s回收大量短时异步任务newFixedThreadPool固定线程数无空闲回收并发量稳定、长期任务newSingleThreadExecutor单线程串行执行任务任务需要有序执行newScheduledThreadPool支持延迟、定时任务定时任务、轮询任务生产禁忌阿里巴巴规范禁止使用Executors创建线程池容易OOM原因部分线程池队列无限大、线程无限多海量任务直接内存溢出五、四大拒绝策略面试必背线程池线程满、队列满新任务触发拒绝策略共四种5.1 四种策略详解AbortPolicy默认直接抛出异常中断任务默认CallerRunsPolicy谁提交的任务谁自己执行主线程执行DiscardPolicy直接丢弃任务不报错、不执行DiscardOldestPolicy丢弃队列最老任务执行当前新任务六、线程池代码实战6.1 基础使用案例import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolDemo { public static void main(String[] args) { // 创建固定5线程池 ExecutorService pool Executors.newFixedThreadPool(5); // 提交10个任务 for (int i 0; i 10; i) { pool.execute(() - { System.out.println(Thread.currentThread().getName() 执行任务); }); } // 关闭线程池 pool.shutdown(); } }6.2 生产级自定义线程池推荐生产环境必须手动创建ThreadPoolExecutor自定义参数杜绝OOM。import java.util.concurrent.*; public class DiyThreadPool { public static void main(String[] args) { // 自定义线程池参数可控、安全稳定 ThreadPoolExecutor pool new ThreadPoolExecutor( 5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue(20), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); // 提交任务 for (int i 0; i 30; i) { pool.execute(() - System.out.println(Thread.currentThread().getName()执行任务)); } pool.shutdown(); } }七、线程池高频面试题汇总为什么不用Executors队列无限长/线程无限多高并发导致OOM线程池执行顺序核心线程→队列→非核心线程→拒绝策略核心线程会销毁吗默认不会常驻复用非核心线程什么时候销毁空闲超时自动回收四种拒绝策略各自场景熟记四种策略行为线程池如何合理配置参数CPU密集型、IO密集型区分设置7.1 线程池参数配置经验工作实用CPU密集型核心线程数 CPU核心数1IO密集型核心线程数 CPU核心数*2八、本篇总结 多线程板块终总结8.1 本篇总结线程池核心优势复用线程、控并发、防OOM、提性能七大参数是线程池灵魂必须熟记工作流程核心线程→队列→非核心线程→拒绝策略禁止使用Executors生产必须自定义ThreadPoolExecutor四大拒绝策略适配不同业务容错场景8.2 多线程全套终总结到此Java多线程板块彻底完结我们从零通关线程基础、线程安全、锁机制、volatile、线程通信、线程池全部核心知识点。