上午 3h 线程池基础概念 Executors 工具类1 线程池是什么0.5h 精讲原生问题不用线程池的弊端以前写法每来一个任务就 new Thread ()线程创建、销毁开销极大浪费 CPU、内存资源任务多了会无限创建线程系统卡顿、OOM 内存溢出线程杂乱无章无法统一管理并发数量线程池核心定义提前初始化一批线程放在「池子」里复用已有线程不用频繁新建 / 销毁任务来了直接分配池内空闲线程执行执行完线程不销毁、回归池里待命。通俗比喻原生 new Thread来一个客人招一个临时工干完就辞退成本极高线程池提前养一批正式员工来任务就安排员工做做完员工待命不辞退2 线程池核心优势0.3h 必背降低资源消耗复用线程避免频繁创建、销毁的系统开销提高响应速度任务到达不用新建线程直接拿空闲线程立刻执行统一管理控制并发线程数、排队任务、统一关闭、调度管控规避无限创建线程限制最大并发防止系统崩溃3 Executors 工具类 三种常用线程池2.2h 精讲 完整代码前置知识点ExecutorsJDK 官方工具类专门快速创建线程池不用自己底层构造。核心提交任务方法execute(Runnable任务)3.1 newFixedThreadPool (int 线程数) 固定数量线程池特点池内线程数量固定不变任务多于线程数时任务进入队列排队适合并发量固定、服务器稳定业务完整代码 逐行解析java运行import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // 自定义任务 class MyTask implements Runnable { private String name; public MyTask(String name) { this.name name; } Override public void run() { // 获取当前执行任务的线程名 System.out.println(Thread.currentThread().getName() 正在执行 name); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() 完成 name); } } public class FixedThreadPoolDemo { public static void main(String[] args) { // 1. 创建固定3个线程的线程池 ExecutorService pool Executors.newFixedThreadPool(3); // 2. 提交5个任务 for (int i 1; i 5; i) { pool.execute(new MyTask(任务 i)); } // 3. 用完关闭线程池 pool.shutdown(); } }运行现象始终只有3 个线程轮流复用执行 5 个任务多余任务排队等待。核心结论线程不会新建更多固定并发数可控稳定。3.2 newSingleThreadExecutor () 单线程池特点池内永远只有 1 个线程所有任务按顺序排队执行不会并发适合需要任务有序执行、不能同时跑的场景完整代码java运行import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SingleThreadDemo { public static void main(String[] args) { // 创建单线程池 ExecutorService pool Executors.newSingleThreadExecutor(); // 提交4个任务 for (int i 1; i 4; i) { pool.execute(new MyTask(有序任务 i)); } pool.shutdown(); } }运行现象任务 1 执行完→任务 2→任务 3→任务 4严格串行有序无并发争抢。3.3 newCachedThreadPool () 可缓存线程池特点无固定线程数按需创建来了任务有空闲线程就复用没有就新建空闲线程闲置 60 秒自动回收适合短期大量瞬时任务不适合高并发长耗时业务容易无限建线程完整代码java运行import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CachedThreadPoolDemo { public static void main(String[] args) { ExecutorService pool Executors.newCachedThreadPool(); // 提交6个任务 for (int i 1; i 6; i) { pool.execute(new MyTask(缓存任务 i)); } pool.shutdown(); } }运行现象瞬间创建多个线程几乎所有任务同时并发执行。下午 2.5h 线程池使用细节 综合案例1 线程池使用标准步骤必背模板通过Executors创建线程池ExecutorService自定义任务类 implements Runnable重写 run ()线程池对象调用execute(任务对象)提交任务所有任务执行完毕调用shutdown()关闭线程池2 线程池执行核心特点线程复用线程执行完任务不销毁回到池里等待下一个任务固定线程池最大并发 设置的线程数多余任务排队单线程池天然串行任务排队有序执行缓存线程池弹性扩容空闲线程自动回收3 综合案例 1固定线程池观察线程复用直接用上面newFixedThreadPool(3)代码重点观察始终就那 3 个线程名称反复出现不是每次任务都新建线程 →完美复用4 综合案例 2单线程池有序排队用newSingleThreadExecutor()代码观察任务严格按提交顺序执行无抢占、无乱序。晚上 1.5h 复盘 巩固练习必做练习分别手写三种线程池提交任务运行看执行区别对比普通new Thread()每次都是新线程线程池复用旧线程练习shutdown()关闭不关闭程序可能一直不退出今日核心总结表格表格线程池类型线程数量执行特点适用场景FixedThreadPool固定 n 个固定并发任务排队常规业务、控制并发量SingleThreadExecutor固定 1 个串行有序执行任务必须按顺序执行CachedThreadPool弹性不固定按需新建、空闲回收短期大量瞬时小任务原计划缺失 超重要知识点必须补充Day28 必学1. 为什么阿里开发规范禁止用 Executors 创建线程池Fixed/Single 任务队列无界任务太多内存溢出 OOMCached 无最大线程限制任务暴增会无限创建线程拖垮服务器实际开发要用ThreadPoolExecutor 手动创建底层线程池后续学2. shutdown () 注意事项shutdown()不再接受新任务已提交任务执行完再关闭不调用 shutdown线程池核心线程一直存活程序不会自动结束3. 线程池核心底层七大参数先认知后续深挖核心线程数、最大线程数、空闲存活时间、阻塞队列、拒绝策略等是线程池本质Executors 只是封装工具。4. 任务提交两种方式execute(Runnable)无返回值submit(Callable)有返回值可以获取线程执行结果衔接 Day21 CallableDay28 验收标准强化版能口述线程池作用、四大优势说出和原生 new Thread 的区别能手写三种线程池创建代码、提交任务、关闭线程池能说出三种线程池各自特点、运行现象、适用场景理解线程复用原理知道线程执行完不销毁知道 Executors 弊端了解实际开发不推荐直接使用线程池执行顺序线程数量抢占式Fixed 固定线程池乱序固定✅ 抢占式Cached 可缓存线程池最乱、完全无序自动增加✅抢占式最强Single 单线程池绝对有序1 个❌ 不抢占排队执行