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

相关推荐
一个人旅程~15 分钟前
完整精华版macbookHighSierra 至Montere-Ventyra版本跨越评估与避坑指南(含证书有效期)
windows·经验分享·macos·电脑
Cheng小攸34 分钟前
【无标题】
windows
Cheng小攸1 小时前
综合实战(3)
windows·php
bucenggaibian1 小时前
搭建CMD编译C语言环境
linux·c语言·windows
ylscode1 小时前
微软发布针对 Windows 11 的 KB5089573 补丁,以修复“周二补丁日”安装问题
windows·安全·microsoft·安全威胁分析
yaoxin52112312 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
IOT.FIVE.NO.113 小时前
2026-05-30-Codex更新后对话消失和沙盒失效:适用人群、问题背景、解决方式与原因分析
人工智能·windows
阿昭L15 小时前
Lab 1-2
windows·恶意代码·逆向工程
Lv_沐曦18 小时前
Windows磁盘驱动器取消黄色感叹号的方法
运维·windows·bitlocker·黄色感叹号
ITHAOGE1520 小时前
下载 | Windows Server 2022官方原版ISO映像!(5月更新、标准版、数据中心版、20348.5139)
windows·科技·微软·电脑