一、为什么要手写线程池面试官考察点1你是否真正理解线程池原理2是否理解任务调度流程3是否掌握并发控制 本质模拟线程复用 任务队列 调度机制二、线程池核心设计思路一个线程池最少需要1任务队列存任务2工作线程执行任务3提交任务接口4线程复用机制三、核心结构设计class MyThreadPool { private BlockingQueueRunnable taskQueue; private ListWorker workers; }四、完整实现代码重点1. 自定义线程池实现import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.ArrayList; import java.util.List; public class MyThreadPool { // 任务队列 private BlockingQueueRunnable taskQueue; // 工作线程集合 private ListWorker workers; // 核心线程数 private int coreSize; public MyThreadPool(int coreSize) { this.coreSize coreSize; taskQueue new LinkedBlockingQueue(); workers new ArrayList(); // 初始化核心线程 for (int i 0; i coreSize; i) { Worker worker new Worker(); workers.add(worker); worker.start(); } } // 提交任务 public void execute(Runnable task) { try { taskQueue.put(task); // 阻塞入队 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } // 工作线程 class Worker extends Thread { Override public void run() { while (true) { try { Runnable task taskQueue.take(); // 阻塞获取任务 task.run(); } catch (InterruptedException e) { break; } } } } }2. 测试代码public class TestThreadPool { public static void main(String[] args) { MyThreadPool pool new MyThreadPool(3); for (int i 0; i 10; i) { int num i; pool.execute(() - { System.out.println(Thread.currentThread().getName() 执行任务 num); }); } } }五、执行流程解析当调用pool.execute(task);执行过程1任务进入阻塞队列2Worker线程从队列取任务3执行 task.run()4线程不会销毁继续复用 这就是线程池核心思想任务排队 线程复用六、当前实现的不足面试加分点这个版本是“简化版”缺少1最大线程数控制2拒绝策略3线程回收机制4线程池关闭功能七、进阶优化版接近面试标准 加入线程数量控制if (workers.size() coreSize) { // 创建新线程 } else { // 放入队列 } 加入拒绝策略if (!taskQueue.offer(task)) { throw new RuntimeException(任务被拒绝); } 加入关闭机制public void shutdown() { for (Worker worker : workers) { worker.interrupt(); } }八、和 ThreadPoolExecutor 对比功能手写线程池ThreadPoolExecutor核心线程支持支持队列支持支持最大线程数简化完整拒绝策略简化完整状态管理无完整九、面试回答模板直接背 面试官问你了解线程池原理吗你可以这样答线程池核心是通过任务队列和工作线程实现线程复用。提交任务时任务先进入阻塞队列工作线程不断从队列中取任务执行从而避免频繁创建和销毁线程。如果是完整线程池还会涉及核心线程数、最大线程数、任务队列和拒绝策略等控制机制。十、总结线程池本质1任务队列存任务2工作线程执行任务3线程复用提高性能