作者:小傅哥博客:https://bugstack.cngithub:https://github.com/fuzhengwei/codeguide/wiki
一、前言人看手机,机器学习!

正好是2020年,看到这张图还是蛮有意思的。以前小时候总会看到一些科技电影,讲到机器人会怎样怎样,但没想到人似乎被娱乐化的东西,搞成了低头族、大肚子!
当意识到这一点时,其实非常怀念小时候。放假的早上跑出去,喊上三五个伙伴,要不下河摸摸鱼、弹弹玻璃球、打打pia、跳跳房子!一天下来真的不会感觉累,但现在如果是放假的一天,你的娱乐安排,很多时候会让头很累!
就像,你有试过学习一天英语头疼,还是刷一天抖音头疼吗?或者玩一天游戏与打一天球!如果你意识到了,那么争取放下一会手机,适当娱乐,锻炼保持个好身体!
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
二、面试题谢飞机,小记!,上次吃亏在线程上,这可能一次坑掉两次吗!
谢飞机:你问吧,我准备好了!!!
面试官:嗯,线程池状态是如何设计存储的?
谢飞机:这!下一个,下一个!
面试官:Worker 的实现类,为什么不使用 ReentrantLock 来实现呢,而是自己继承AQS?
谢飞机:我...!
面试官:那你简述下,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>这是一段用于创建线程池的例子,相信你已经用了很多次了。
线程池的核心目的就是资源的利用,避免重复创建线程带来的资源消耗。因此引入一个池化技术的思想,避免重复创建、销毁带来的性能开销。
那么,接下来我们就通过实践的方式分析下这个池子的构造,看看它是如何处理线程的。
为了更好的理解和分析关于线程池的源码,我们先来按照线程池的思想,手写一个非常简单的线程池。
其实很多时候一段功能代码的核心主逻辑可能并没有多复杂,但为了让核心流程顺利运行,就需要额外添加很多分支的辅助流程。就像我常说的,为了保护手才把擦屁屁纸弄那么大!

关于图 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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号