0

0

手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

蓮花仙者

蓮花仙者

发布时间:2025-07-16 10:22:13

|

502人浏览过

|

来源于php中文网

原创

作者:小傅哥博客:https://bugstack.cngithub:https://github.com/fuzhengwei/codeguide/wiki

一、前言

人看手机,机器学习!

手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

正好是2020年,看到这张图还是蛮有意思的。以前小时候总会看到一些科技电影,讲到机器人会怎样怎样,但没想到人似乎被娱乐化的东西,搞成了低头族、大肚子!

当意识到这一点时,其实非常怀念小时候。放假的早上跑出去,喊上三五个伙伴,要不下河摸摸鱼、弹弹玻璃球、打打pia、跳跳房子!一天下来真的不会感觉累,但现在如果是放假的一天,你的娱乐安排,很多时候会让头很累!

就像,你有试过学习一天英语头疼,还是刷一天抖音头疼吗?或者玩一天游戏与打一天球!如果你意识到了,那么争取放下一会手机,适当娱乐,锻炼保持个好身体!

二、面试题

谢飞机,小记!,上次吃亏在线程上,这可能一次坑掉两次吗!

谢飞机:你问吧,我准备好了!!!

面试官:嗯,线程池状态是如何设计存储的?

谢飞机:这!下一个,下一个!

面试官:Worker 的实现类,为什么不使用 ReentrantLock 来实现呢,而是自己继承AQS?

Lexica
Lexica

一个搜索 AI 生成图片的网站,可以上传图片或prompts搜索图片。

下载

谢飞机:我...!

面试官:那你简述下,execute 的执行过程吧!

谢飞机:再见!

三、线程池讲解1. 先看个例子代码语言:javascript代码运行次数:0运行复制
<code class="javascript">ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));threadPoolExecutor.execute(() -> {    System.out.println("Hi 线程池!");});threadPoolExecutor.shutdown();// Executors.newFixedThreadPool(10);// Executors.newCachedThreadPool();// Executors.newScheduledThreadPool(10);// Executors.newSingleThreadExecutor();</code>

这是一段用于创建线程池的例子,相信你已经用了很多次了。

线程池的核心目的就是资源的利用,避免重复创建线程带来的资源消耗。因此引入一个池化技术的思想,避免重复创建、销毁带来的性能开销。

那么,接下来我们就通过实践的方式分析下这个池子的构造,看看它是如何处理线程的。

2. 手写一个线程池2.1 实现流程

为了更好的理解和分析关于线程池的源码,我们先来按照线程池的思想,手写一个非常简单的线程池。

其实很多时候一段功能代码的核心主逻辑可能并没有多复杂,但为了让核心流程顺利运行,就需要额外添加很多分支的辅助流程。就像我常说的,为了保护手才把擦屁屁纸弄那么大!

手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

关于图 21-1,这个手写线程池的实现也非常简单,只会体现出核心流程,包括:

有n个一直在运行的线程,相当于我们创建线程池时允许的线程池大小。把线程提交给线程池运行。如果运行线程池已满,则把线程放入队列中。最后当有空闲时,则获取队列中线程进行运行。2.2 实现代码代码语言:javascript代码运行次数:0运行复制
<code class="javascript">public class ThreadPoolTrader implements Executor {    private final AtomicInteger ctl = new AtomicInteger(0);    private volatile int corePoolSize;    private volatile int maximumPoolSize;    private final BlockingQueue<Runnable> workQueue;    public ThreadPoolTrader(int corePoolSize, int maximumPoolSize, BlockingQueue<Runnable> workQueue) {        this.corePoolSize = corePoolSize;        this.maximumPoolSize = maximumPoolSize;        this.workQueue = workQueue;    }    @Override    public void execute(Runnable command) {        int c = ctl.get();        if (c < corePoolSize) {            if (!addWorker(command)) {                reject();            }            return;        }        if (!workQueue.offer(command)) {            if (!addWorker(command)) {                reject();            }        }    }    private boolean addWorker(Runnable firstTask) {        if (ctl.get() >= maximumPoolSize) return false;        Worker worker = new Worker(firstTask);        worker.thread.start();        ctl.incrementAndGet();        return true;    }    private final class Worker implements Runnable {        final Thread thread;        Runnable firstTask;        public Worker(Runnable firstTask) {            this.thread = new Thread(this);            this.firstTask = firstTask;        }        @Override        public void run() {            Runnable task = firstTask;            try {                while (task != null || (task = getTask()) != null) {                    task.run();                    if (ctl.get() > maximumPoolSize) {                        break;                    }                    task = null;                }            } finally {                ctl.decrementAndGet();            }        }        private Runnable getTask() {            for (; ; ) {                try {                    System.out.println("workQueue.size:" + workQueue.size());                    return workQueue.take();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }    private void reject() {        throw new RuntimeException("Error!ctl.count:" + ctl.get() + " workQueue.size:" + workQueue.size());    }    public static void main(String[] args) {        ThreadPoolTrader threadPoolTrader = new ThreadPoolTrader(2, 2, new ArrayBlockingQueue<Runnable>(10));        for (int i = 0; i < 10; i++) {            int finalI = i;            threadPoolTrader.execute(() -> {                try {                    Thread.sleep(1500);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("任务编号:" + finalI);            });        }    }}// 测试结果任务编号:1任务编号:0workQueue.size:8workQueue.size:8任务编号:3workQueue.size:6任务编号:2workQueue.size:5任务编号:5workQueue.size:4任务编号:4workQueue.size:3任务编号:7workQueue.size:2任务编号:6workQueue.size:1任务编号:8任务编号:9workQueue.size:0workQueue.size:0</code>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

3460

2026.01.21

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2795

2024.08.16

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

2

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

8

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

68

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

59

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

46

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

24

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.1万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号