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

相关推荐
小职boy4 小时前
不忘初心Windows系统工具箱下载 - 系统优化与维护工具(v1.1)
windows·系统·电脑软件·工具箱
Mininglamp_27185 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native
贾斯汀frank6 小时前
C# 15 类型系统改进:Union Types
开发语言·windows·c#
YHHLAI8 小时前
Agent 智能体开发实战 · 第四课:完整工具集 —— 打造 AI 编程 Agent 的工具箱
人工智能·windows·microsoft
精神底层11 小时前
Skill——提示词的系统化封装
windows·.net
技术不好的崎鸣同学12 小时前
Windows 命令提示符(CMD)恶意脚本分析篇
网络·windows·安全·系统安全
2601_9623649715 小时前
告别明文密码:Windows Hello 抗钓鱼双因子认证安全体系科普
windows
问窗17 小时前
Rust实现Windows本地搜索工具
windows·搜索引擎·rust
Roc-xb17 小时前
你似乎已在另一个帐户上设置了 Windows Hello。请将人脸识别从其他帐户删除,然后重试。
windows·人脸识别
HAPPY酷18 小时前
【ROS2】16G 内存笔记本跑 ROS2 仿真?VMware 虚拟机“保姆级”配置指南 (R9 7940HX + RTX 4060)
java·linux·ide·windows·pycharm