手写线程池实战:从原理到实现,深入理解线程池工作机制

手写线程池实战:从原理到实现,深入理解线程池工作机制

本文参考B站技术视频 《Java手写线程池实战》 的核心思路实现,结合代码解析线程池设计思想

手写线程池实战:从原理到实现,深入理解线程池工作机制_第1张图片

一、为什么需要线程池?

在多线程编程中,频繁创建/销毁线程会产生大量性能开销。线程池通过✨ 线程复用任务队列管理 机制,实现了:

  1. ️ 降低资源消耗
  2. ⚡ 提高响应速度
  3. 增强可管理性

二、线程池核心参数解析

public class MyThreadPool {
    private final int corePoolSize;    //  核心线程数
    private final int maxSize;        //  最大线程数
    private final int timeout;        // ⏳ 非核心线程空闲超时
    private final TimeUnit timeUnit;  // ⏰ 时间单位
    private final BlockingQueue<Runnable> blockingQueue; //  任务队列
    private final RejectHandle rejectHandle; //  拒绝策略
}
参数 作用说明
corePoolSize 长期存活的线程数量,即使处于空闲状态
maxSize 允许创建的最大线程数
timeout 非核心线程空闲等待时间(超时后自动销毁)
blockingQueue 任务缓存队列(推荐使用有界队列)
rejectHandle 队列满时的拒绝策略

三、实现线程池的关键步骤

3.1 任务提交逻辑

手写线程池实战:从原理到实现,深入理解线程池工作机制_第2张图片

3.2 核心线程实现

class CoreThread extends Thread {
    @Override
    public void run() {
        while (true) { // ♻️ 永久运行
            try {
                Runnable task = blockingQueue.take();
                task.run(); // ♂️立即执行任务
            } catch (InterruptedException e) {
                // ⚠️处理中断异常
            }
        }
    }
}

3.3 非核心线程实现⏳

手写线程池实战:从原理到实现,深入理解线程池工作机制_第3张图片

3.4 拒绝策略示例

// 直接丢弃策略实现
public class DiscardRejectHandle implements RejectHandle {
    @Override
    public void reject(Runnable command, MyThreadPool threadPool) {
        System.out.println("❌ 任务被丢弃: " + command);
    }
}

其他常见拒绝策略:

  • AbortPolicy:抛出RejectedExecutionException
  • CallerRunsPolicy:由提交线程自己执行任务
  • ️ DiscardOldestPolicy:丢弃队列中最旧的任务

四、测试验证

public static void main(String[] args) {
    MyThreadPool pool = new MyThreadPool(3, 5, 1, TimeUnit.SECONDS, 
        new ArrayBlockingQueue<>(2), new DiscardRejectHandle());
    
    for (int i = 0; i < 8; i++) {
        int taskId = i;
        pool.execute(() -> {
            try {
                Thread.sleep(1000); // 模拟任务执行
                System.out.println(Thread.currentThread().getName() 
                    + " ✅ 执行任务-" + taskId);
            } catch (InterruptedException e) {
                e.printStackTrace(); // ⚠️异常处理
            }
        });
    }
}

手写线程池实战:从原理到实现,深入理解线程池工作机制_第4张图片

执行结果特征:

手写线程池实战:从原理到实现,深入理解线程池工作机制_第5张图片

五、与JDK线程池对比⚖️

特性 手写线程池 ThreadPoolExecutor
线程分类 核心/临时线程 核心/非核心线程
队列策略 必须显式指定 支持多种队列类型
拒绝策略 需自定义实现 内置4种标准策略
线程回收 简单超时机制 支持灵活配置
状态管理 未实现 完整生命周期管理(RUNNING/SHUTDOWN等)

六、关键问题思考

手写线程池实战:从原理到实现,深入理解线程池工作机制_第6张图片

七、扩展建议

  1. 添加线程池监控功能
  2. 实现优雅关闭接口
  3. 支持线程工厂定制
  4. 增加运行状态统计

原理深入讲解推荐观看:《Java手写线程池实战》

通过手写线程池,不仅可以深入理解线程池的工作原理,还能根据实际业务需求进行定制化扩展。建议读者结合JDK原生线程池源码进行对比学习,收获会更大!

你可能感兴趣的:(java,开发语言)