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?

谢飞机:我...!

Chromox
Chromox

Chromox是一款领先的AI在线生成平台,专为喜欢AI生成技术的爱好者制作的多种图像、视频生成方式的内容型工具平台。

下载

面试官:那你简述下,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

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

765

2023.08.10

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

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

4212

2026.01.21

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

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

2910

2024.08.16

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

71

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

82

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

热门下载

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

精品课程

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

共48课时 | 10.6万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

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

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