首页 > 运维 > linux运维 > 正文

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

蓮花仙者
发布: 2025-07-16 10:22:13
原创
492人浏览过

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

一、前言

人看手机,机器学习!

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

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

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

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

立即进入豆包AI人工智官网入口”;

立即学习豆包AI人工智能在线问答入口”;

二、面试题

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

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

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

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

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

谢飞机:我...!

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程483
查看详情 豆包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>
登录后复制

以上就是手写线程池,对照学习ThreadPoolExecutor线程池实现原理!的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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