手写线程池(从0实现 ThreadPoolExecutor 核心思想)

一、为什么要手写线程池

面试官考察点:

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)线程复用(提高性能)

相关推荐
twc8292 小时前
大模型生成 QA Pairs 提升 RAG 应用测试效率的实践
服务器·数据库·人工智能·windows·rag·大模型测试
wenlonglanying3 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
polaris06305 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
mldlds5 小时前
windows手动配置IP地址与DNS服务器以及netsh端口转发
服务器·windows·tcp/ip
取个名字太难了a5 小时前
DebugActiveProcess 调试流程分析(一)
windows
Java.熵减码农6 小时前
火绒安全软件误杀explorer.exe导致黑屏解决方法
windows
love530love6 小时前
不用聊天软件 OpenClaw 手机浏览器远程访问控制:Tailscale 配置、设备配对与常见问题全解
人工智能·windows·python·智能手机·tailscale·openclaw·远程访问控制
夏末蝉未鸣016 小时前
Windows环境下载并安装milvus
windows·milvus
葡萄星球7 小时前
win11右键菜单一步改成win10样式
windows