当前位置: 首页 > news >正文

手写线程池实例并测试

前言:在之前的文章中介绍过线程池的核心原理,在一次面试中面试官让手写线程池,这块知识忘记的差不多了,因此本篇文章做一个回顾。
希望能够加深自己的印象以及帮助到其他的小伙伴儿们😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞

在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,曾经在某央企公司实习,目前在某税务公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

在这里插入图片描述

以下正文开始

在线程池核心原理篇介绍过线程池的核心原理,今天来模拟线程池和工作队列的流程,以及编写代码和测试类进行测试。下面附下之前线程池的核心流程:
在这里插入图片描述
在线程池核心原理的源码中,涉及到了一系列的流程,包括线程池队列数量是否已满,运用什么样的拒绝策略等。在我们手写线程池的代码中,不需要考虑那么多因素,只需要模拟简单的情景和过程,因此整体来讲还是比较简单的。

手写线程池,必不可少的组件有任务队列,任务的消费者线程池,线程池创建等。我们也可定义构造方法,创建指定大小的线程池线程个数。当然在使用完线程池中的线程后,我们需要考虑将其销毁或关闭。
在这里插入图片描述

相关代码和解释如下:

package XIAOWEI;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.IntStream;public class ThreadPool {private static final int WorkQueueSIZE = 5;private BlockingQueue<Runnable> workQueue;private List<WorkThread> workThreads=new ArrayList<WorkThread>();/*** @author xiaowei* @param poolSize* @param workQueue* 构造方法,传线程池的大小和阻塞队列*/public ThreadPool(int poolSize,BlockingQueue<Runnable> workQueue) {this.workQueue = workQueue;IntStream.range(0,poolSize).forEach((i)->{WorkThread workThread=new WorkThread();workThread.start();workThreads.add(workThread);});}/*** @param poolSize* 在ThreadPool的构造方法中传入线程池的大小*/public ThreadPool(int poolSize){this(poolSize,new LinkedBlockingQueue<>(WorkQueueSIZE));}/*** @param task* 通过线程池执行任务*/public void extcute(Runnable task){try {workQueue.put(task);} catch (InterruptedException e) {e.printStackTrace();}}public void shutdown(){if(workThreads!=null && workThreads.size()>0){workThreads.stream().forEach((workThread) -> {workThread.interrupt();});}}/*** 内部类 源源不断的消耗workQueue中的任务*/class WorkThread extends Thread {@Overridepublic void run() {Thread currentThread = Thread.currentThread();// 死循环 不断一直消费队列中的任务 直到任务被消费完全while (true) {try {if (currentThread.isInterrupted()) {break;}Runnable workTasK = workQueue.take();workTasK.run();} catch (InterruptedException e) {currentThread.interrupt();}}}}
}

相关测试代码如下:

package XIAOWEI;import java.util.stream.IntStream;public class ThreadPoolTest {public static void main(String[] args) {ThreadPool threadPool = new ThreadPool(5);IntStream.range(0,10).forEach((i)->{threadPool.extcute(()->{System.out.println(Thread.currentThread().getName()+"2023一起加油");});});threadPool.shutdown();}
}

一共在线程池中加入了五个线程和十个任务,因此每个线程会执行两个任务。
测试结果如下图所示:
在这里插入图片描述

好了,本篇文章就先分享到这里了,后续会继续分享其他方面的知识,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

相关文章:

手写线程池实例并测试

前言&#xff1a;在之前的文章中介绍过线程池的核心原理&#xff0c;在一次面试中面试官让手写线程池&#xff0c;这块知识忘记的差不多了&#xff0c;因此本篇文章做一个回顾。 希望能够加深自己的印象以及帮助到其他的小伙伴儿们&#x1f609;&#x1f609;。 如果文章有什么…...

实操go开发环境的配置

1、Go 安装包下载&#xff0c;下载地址如下&#xff1a; go语言中文网下载&#xff08;本人电脑的系统是Windows&#xff0c;这里以Windows版本的安装包为例&#xff0c;安装就是傻瓜式安装&#xff0c;只要点下一步–下一步–完成就可以了&#xff0c;本人安装在C盘下。 我…...

华为OD机试真题Python实现【匿名信】真题+解题思路+代码(20222023)

匿名信 题目 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字减下来,剪拼成匿名信。 现在又一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。 但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注…...

阿里淘系面试经历(一)

文章目录 1、JVM讲一下,尽你所知道的1. 类的加载过程1.1 加载过程介绍1.2 类加载流程1.3 类加载器2. 垃圾回收2.1 如何确定对象已死2.2 垃圾回收算法2.2.1 标记--清除算法2.2.2 复制算法2.2.3 标记--整理算法2.3 垃圾收集器2.3.1 Serial 收集器2.3.2 ParNew 收集器2.3.3 Paral…...

matplotlib绘制三维图

目录线状堆积图 PolygonPlot三维表面图 SurfacePlot散点图ScatterPlot柱形图 BarPlot三维直方图螺旋曲线图 LinePlotContourPlot轮廓图网状图 WireframePlot箭头图二维三维合并文本图Text三维多个子图线状堆积图 PolygonPlot Axes3D.add_collection3d(col, zs0, zdir‘z’)  …...

4万字c++讲解+区分c和c++,不来可惜了(含代码+解析)

目录 1 C简介 1.1 起源 1.2 应用范围 1.3 C和C 2开发工具 3 基本语法 3.1 注释 3.2关键字 3.3标识符 4 数据类型 4.1基本数据类型 4.2 数据类型在不同系统中所占空间大小 4.3 typedef声明 4.4 枚举类型 5 变量 5.1 变量的声明和定义 5.2 变量的作用域 6 运算符…...

AcWing 482. 合唱队形

482. 合唱队形N 位同学站成一排&#xff0c;音乐老师要请其中的 (N−K) 位同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。     合唱队形是指这样的一种队形&#xff1a;设 K位同学从左到右依次编号为 1&#xff0c;2…&#xff0c;K&#xff0c;他们的身高分别为…...

Pytorch深度学习实战3-4:通俗理解张量Tensor的爱因斯坦求和(附实例)

目录1 爱因斯坦求和由来2 爱因斯坦求和原理3 实例&#xff1a;字母表示法3.1 向量运算3.2 矩阵运算3.3 张量运算4 实例&#xff1a;常量表示法4.1 向量运算4.2 矩阵运算4.3 张量运算1 爱因斯坦求和由来 爱因斯坦求和约定(Einstein summation convention)是一种标记的约定&#…...

GEE学习笔记 五十六:GEE中如何把文件导出到Google Drive的子目录

今天在群里看到有人在问一个问题&#xff0c;如何使用GEE把文件导出到Google Drive的子目录中&#xff1f;这里我就简单的说一下这个问题。 首先&#xff0c;在GEE中我们都知道了如何将数据导出导出Google Drive的文件夹中&#xff0c;如下面的一个例子&#xff1a; var geome…...

【Go基础】数据库编程

文章目录1. SQL语法简介2. MySQL最佳实践3. Go SQL驱动接口解读4. 数据库增删改查5. stmt6. SQLBuilder6.1 Go-SQLBuilder6.2 Gendry6.3 自行实现SQLBuilder7. GORM8. Go操作MongoDB1. SQL语法简介 SQL&#xff08;Structured Query Language&#xff09;是一套语法标准&#…...

【颠覆软件开发】华为自研IDE!未来IDE将不可预测!

IDE是软件开发生态的入口&#xff0c;但目前我们所使用的IDE基本都是由国外巨头提供&#xff0c;比如Visual Studio、Eclipse、JetBrains。这些IDE具有很高的断供风险&#xff0c;与操作系统、芯片、编程语言一样&#xff0c;非常重要。 随着越来越多的软件开始采用云上开发模…...

怎样从零基础学黑客

可以说想学黑客技术&#xff0c;要求你首先是一个“T”字型人才&#xff0c;也就是说电脑的所有领域你都能做的来&#xff0c;而且有一项是精通的。因此作为一个零基础的黑客爱好者来说&#xff0c;没有良好的基础是绝对不行的&#xff0c;下面我就针对想真正学习黑客的零基础朋…...

burp小程序抓包

身为一名码农&#xff0c;抓包肯定是一项必备技能。工作中遇到很多次需要对小程序进行抓包排查问题。下面分享一下我的抓包方式&#xff0c;使用的是电脑版小程序抓包&#xff0c;跟手机的方式都差不多的。 一、环境 微信版本&#xff1a;3.6.0.18 Burpsuite版本&#xff1a…...

文件上传攻击骚操作

允许直接上传shell 只要有文件上传功能&#xff0c;那么就可以尝试上传webshell直接执行恶意代码&#xff0c;获得服务器权限&#xff0c;这是最简单也是最直接的利用。 允许上传压缩包 如果可以上传压缩包&#xff0c;并且服务端会对压缩包解压&#xff0c;那么就可能存在Zip …...

Scala流程控制(第四章:分支控制、嵌套分支、switch分支、for循环控制全、while与do~while、多重与中断)

文章目录第 4 章 流程控制4.1 分支控制 if-else4.1.1 单分支4.1.2 双分支4.1.3 多分支4.2 嵌套分支4.3 Switch 分支结构4.4 For 循环控制4.4.1 范围数据循环&#xff08;To&#xff09;4.4.2 范围数据循环&#xff08;Until&#xff09;4.4.3 循环守卫4.4.4 循环步长4.4.5 嵌套…...

华为OD机试真题Python实现【整理扑克牌】真题+解题思路+代码(20222023)

整理扑克牌 题目 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请安如下规则对这一组扑克牌进行整理。 步骤一: 对扑克牌进行分组,规则如下 当牌面数字相同张数大于等于4时,组合牌为炸弹;三张相同牌面数字+两张相同牌面数字,且三张牌与两张牌不相同时,组合牌…...

【春秋云境】CVE-2022-28525

靶标介绍&#xff1a; ​ ED01-CMS v20180505 存在任意文件上传漏洞 打开靶场&#xff1a; 盲猜一波弱密码admin:admin就进去了。登录后在图中位置点击进行图片更新&#xff0c;需要将密码等都写上 抓包将图片信息进行替换&#xff0c;并修改文件名&#xff1a; POST /admin…...

Android设置取消系统闹钟

系统闹钟包名&#xff1a;com.android.deskclock 调用系统闹钟&#xff0c;首先在清单文件AndroidManifest.xml中添加权限&#xff1a; <uses-permission android:name"com.android.alarm.permission.SET_ALARM" />设置系统闹钟&#xff1a; public static v…...

使用 Node.js 多进程提高任务执行效率

什么是 Node 多进程&#xff1f; Node 是在单个线程中运行&#xff0c;我们虽然没办法开启额外的线程&#xff0c;但是可以开启进程集群。这样可以让下载任务和上传任务同时进行。 使用多进程进行初步代码优化 const dl require(./download.js) const ul require(./upload…...

[Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]

[Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]1.新手教程(小白也能学会)2.开始准备2.1myBlog是hugo的项目1.安装Hugo2.创建hugo项目2.2 xxxx.github.io是github.io中规定的pages项目3.成功部署4.TODO自动化workflows部署github.io1.新手教程(小白也能学会) …...

为什么头部AI工厂已全面切换PyTorch 3.0静态图训练?揭秘2024年Q2实测吞吐提升3.8倍、成本下降41%的关键配置

第一章&#xff1a;PyTorch 3.0静态图训练的企业级演进全景PyTorch 3.0标志着深度学习框架从动态优先范式向动静统一架构的关键跃迁。其核心突破在于TorchDynamo Inductor后端的深度融合&#xff0c;使torch.compile()不再仅是实验性优化器&#xff0c;而成为企业级生产训练流…...

STM32驱动SG90舵机:从PWM原理到蓝牙远程控制实战

1. 认识SG90舵机与PWM控制 第一次拿到SG90这个小家伙时&#xff0c;我差点以为是个玩具电机。直到把它接上STM32&#xff0c;看到它能精准地停在指定角度&#xff0c;才意识到这玩意儿在机器人、智能家居里有多实用。SG90是一种微型舵机&#xff0c;三根线分别接电源&#xff0…...

基于偏振无关的传输相位调控技术,实现可见光超透镜的优化设计

基于传输相位的可见光超透镜 偏振无关搞过光学设计的工程师都知道&#xff0c;传统透镜那个笨重的曲面有多让人头疼。现在有了一种黑科技——可见光波段的超透镜&#xff0c;厚度只有几百纳米&#xff0c;却能实现传统透镜的光学效果。关键是这玩意儿还搞定了偏振相关性这个老大…...

研发物料管理新思路:巧用SAP预留功能实现打样耗材精准管控

研发物料管理新思路&#xff1a;巧用SAP预留功能实现打样耗材精准管控 在制造业研发部门&#xff0c;物料管理一直是令人头疼的难题。不同于生产线的标准化流程&#xff0c;研发活动往往伴随着频繁的设计变更、小批量试制和突发性物料需求。传统的手工台账或Excel表格管理方式&…...

论文被吐槽逻辑乱?,有哪些真正实测靠谱的的降AI率平台推荐?

毕业论文降AI率&#xff0c;优先选语义重构 逻辑优化 去AI痕迹的工具&#xff0c;免费与付费结合更高效。下面按中文、英文、免费/付费分类推荐&#xff0c;附实测效果与适用场景。 一、中文论文降重工具&#xff08;最常用&#xff09; 1. 千笔AI&#xff08;综合全能首选&a…...

2026上位机开发技术栈全景:C#、Qt、Python谁才是你的最优解?

引言&#xff1a;上位机开发的黄金时代与技术抉择 在2026年的工业4.0浪潮中&#xff0c;上位机&#xff08;Upper Computer&#xff09;作为工业自动化系统的“大脑中枢”&#xff0c;正以前所未有的深度融入智能制造、能源管理、医疗设备和物联网&#xff08;IoT&#xff09;生…...

基于西门子S7-1200的换热站PLC与换热器程序,V16及以上博图WinCC画面组态,手自动...

换热站plc程序换热器程序 &#xff08;22&#xff09;采用西门子S7-1200博图WinCC画面组态&#xff0c;博图V16及以上版本都可以仿真运行&#xff0c;无需硬件。 系统带有手动&#xff0f;自动模式&#xff0c;运行数据动态实时显示&#xff0c;带温度实时曲线显示&#xff0c;…...

【DexGraspNet与多指手抓取算法详解】第三章 DexGraspNet数据集构建机理

目录 第三章 DexGraspNet数据集构建机理 第一部分 原理详解 3.1 数据生成流程总览 3.1.1 Asset准备与处理 3.1.1.1 ShapeNetSem物体库筛选 3.1.1.1.1 几何网格清理与流形检测 3.1.1.1.2 物理属性赋值(质量、质心) 3.1.1.2 视觉资产渲染管线 3.1.1.2.1 材质与纹理映射…...

Unity3D物体缩放避坑指南:为什么你的Transform.localScale总是不生效?

Unity3D物体缩放避坑指南&#xff1a;为什么你的Transform.localScale总是不生效&#xff1f; 在Unity3D开发中&#xff0c;Transform.localScale属性看似简单&#xff0c;却隐藏着许多让开发者头疼的陷阱。不少开发者都遇到过这样的场景&#xff1a;明明代码里设置了localScal…...

ESP32-S3的AI新玩法:除了语音唤醒,还能用TensorFlow Lite Micro做哪些酷事?(环境音识别/振动监测实战)

ESP32-S3边缘智能实战&#xff1a;从环境音识别到工业振动监测的AI新范式 当一颗售价不到5美元的芯片能够听懂玻璃破碎声、预测电机故障&#xff0c;甚至识别婴儿啼哭时&#xff0c;物联网设备的"感知能力"正在被重新定义。ESP32-S3搭配TensorFlow Lite Micro&#x…...