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