java 多线程之Worker Thread模式(Thread Pool模式)
Worker Thread模式
Worker的意思是工作的人,在Worker Thread模式中,工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来。
Worker Thread模式也被成为Background Thread(背景线程)模式,另外,如果从保存多个工人线程的场所这一点看,我们也可以称这种模式为Thread Pool模式。
Worker Thread模式中的角色
TransPortThread [将部件塞到传送带上](委托者)
创建表示工作请求的Cargo并将其传递给SimpleChannel 。在示例程序中,TransPortThread 相当于该角色。
2.SimpleChannel [传送带的角色](通信线路)
SimpleChannel 角色接受来自于TransPortThread 的Cargo,并将其传递给WorkerThread。在示例程序中,SimpleChannel 相当于该角色。
3.WorkerThread(工人)
WorkerThread角色从Channel中获取Cargo,并进行工作,当一项工作完成后,它会继续去获取另外的Cargo,在示例程序中,WorkerThread相当于该角色。
4.Cargo(部件)
Cargo角色是表示工作中的部件,Cargo角色中保存了进行工作所必须的信息,在示例程序中,Cargo相当于该部件角色。
Worker Thread使用场景
想象这样一个场景,一个工厂在生产货物,在一个车间里,有几个工人,每次生产部件准备后,车间外的人就将部件放到车间的传送带上,工人每次做完一个货品就从桌子上取部件。在这里,注意到,部件并不是直接交给工人的,另外一点,工人并不是做完一个部件就回家换个新人,后者在现实有点滑稽,但是在程序中却对应一个典型的线程使用方法:线程池。
所谓线程池,就是对线程的复用,当线程执行完任务之后就继续取其他任务执行,而不是销毁启动新线程执行其他任务。因为线程的启动对于系统性能开销比较大,所以这样对于系统性能的提高很有好处。
Main.java
public class WorkClient {public static void main(String[] args) {// 创建容量为5的SimpleChannel实例(数据缓冲通道)SimpleChannel simpleChannel = new SimpleChannel(5);// 启动工作通道开始处理数据(消费者启动)simpleChannel.startWork();// 启动三个数据传输线程(生产者角色)new TransPortThread("june", simpleChannel).start();new TransPortThread("july", simpleChannel).start();new TransPortThread("alen", simpleChannel).start();}}
Cargo.java
角色:部件或货物
import java.util.Optional;/*** 货物类,包含货物编号和名称,并提供执行操作时打印线程执行信息的功能** @author [请填写作者名称]* @version 1.0*/
public class Cargo {/*** 货物名称*/private final String name;/*** 货物编号*/private final int num;/*** 构造方法,初始化货物信息** @param name 货物名称* @param num 货物编号*/public Cargo(String name, int num) {this.name = name;this.num = num;}/*** 执行货物处理操作,打印当前线程名称和货物信息*/public void execute(){Optional.of(Thread.currentThread().getName()+" executed "+this.toString()).ifPresent(System.out::println);}/*** 获取货物信息的字符串表示** @return 格式化后的货物信息(例如:Cargo ==> NO.123 Name.ItemA)*/@Overridepublic String toString() {return "Cargo ==> NO."+num+" Name."+name;}
}
SimpleChannel.java
职责:将部件或货物从源头传给处理端
import java.util.Arrays;/*** 简单线程通信通道,管理货物队列和工作线程池* 使用环形缓冲区实现生产者-消费者模式,通过synchronized和wait/notify机制保证线程安全*/
public class SimpleChannel {/** 缓冲区最大容量 */private static final int BUFFER_SIZE = 100;/** 环形缓冲区数组,存储货物对象 */private final Cargo[] cargoQueue;/** 队列头指针,指向下一个要取出的元素位置 */private int headIndex;/** 当前队列中的元素数量 */private int count;/** 队列尾指针,指向下一个要插入的元素位置 */private int tailIndex;/** 工作线程池 */private final WorkerThread[] workerPool;/*** 构造方法初始化通道* @param workerCount 工作线程数量*/public SimpleChannel(int workerCount) {this.cargoQueue = new Cargo[BUFFER_SIZE];this.headIndex = 0;this.count = 0;this.tailIndex = 0;this.workerPool = new WorkerThread[workerCount];this.init();}/*** 初始化工作线程池* 为每个线程设置名称并绑定当前通道实例*/private void init() {for (int i = 0; i < workerPool.length; i++) {workerPool[i] = new WorkerThread("worker-"+i, this);}}/*** 启动所有工作线程开始工作* 通过遍历线程池调用start()方法启动每个线程*/public void startWork() {Arrays.asList(workerPool).forEach(WorkerThread::start);}/*** 生产者添加货物到缓冲区* @param cargo 要添加的货物对象* @throws InterruptedException 线程中断异常*/public synchronized void pushCargo(Cargo cargo) {while (count >= BUFFER_SIZE) {try {this.wait(); // 缓冲区满时等待} catch (InterruptedException e) {// 异常处理(建议补充日志)}}// 添加货物到尾部并更新指针this.cargoQueue[tailIndex] = cargo;this.tailIndex = (this.tailIndex + 1) % this.cargoQueue.length;this.count++;this.notifyAll(); // 通知等待线程}/*** 消费者从缓冲区取出货物* @return 取出的货物对象* @throws InterruptedException 线程中断异常*/public synchronized Cargo popCargo() {while (count <= 0) {try {this.wait(); // 缓冲区空时等待} catch (InterruptedException e) {// 异常处理(建议补充日志)}}// 取出头部元素并更新指针Cargo cargo = this.cargoQueue[headIndex];this.headIndex = (this.headIndex + 1) % this.cargoQueue.length;this.count--;this.notifyAll(); // 通知等待线程return cargo;}
}
TransPortThread .java
职责:将请求的信息塞到传输通道上去
/*** 运输线程,负责持续生成货物并推送到传输通道 {@link SimpleChannel}*/
public class TransPortThread extends Thread {private SimpleChannel simpleChannel;/*** 静态随机数生成器,用于生成随机休眠时间*/private static final Random RANDOM = new Random(System.currentTimeMillis());/*** 构造方法** @param name 线程名称* @param simpleChannel 货物传输通道*/public TransPortThread(String name, SimpleChannel simpleChannel) {super(name);this.simpleChannel = simpleChannel;}@Overridepublic void run() {try {int i = 0;// 无限循环持续生成货物while (true){Cargo cargo = new Cargo(getName(), i++); // 创建货物对象(包含线程名和序号)this.simpleChannel.pushCargo(cargo); // 将货物推送到通道Thread.sleep(RANDOM.nextInt(1000)); // 随机休眠 0-1000ms}} catch (InterruptedException e) {// 线程中断时的异常处理(当前空实现)}}
}
WorkerThread.java
职责:从传输带上获取部件或货物
import java.util.Random;
/*** 工作线程类,负责从共享通道中持续获取任务并执行*/
public class WorkerThread extends Thread {/*** 存储任务通道实例,用于获取待处理的任务对象*/private final SimpleChannel simpleChannel;/*** 静态随机数生成器,用于生成随机休眠时间(模拟任务执行间隔)*/private static final Random random = new Random(System.currentTimeMillis());/*** 构造方法初始化线程名称和任务通道* @param name 线程名称标识* @param simpleChannel 任务通道对象,用于获取待处理任务*/public WorkerThread(String name, SimpleChannel simpleChannel) {super(name);this.simpleChannel = simpleChannel;}/*** 线程执行主体方法,持续循环执行以下操作:* 1. 从通道中获取任务对象* 2. 执行任务* 3. 随机休眠(模拟任务处理间隔)*/@Overridepublic void run() {while (true) {try {// 从通道中获取任务对象Cargo cargo = simpleChannel.popCargo();// 执行任务逻辑cargo.execute();// 随机休眠0-1000毫秒(模拟任务间隔)Thread.sleep(random.nextInt(1000));} catch (Exception e) {// 异常处理:打印堆栈信息(实际应用中建议添加更完善的异常处理)e.printStackTrace();}}}
}
执行的结果
worker-1 executed Cargo ==> NO.0 Name.alen
worker-0 executed Cargo ==> NO.0 Name.june
worker-4 executed Cargo ==> NO.0 Name.july
worker-3 executed Cargo ==> NO.1 Name.june
worker-0 executed Cargo ==> NO.1 Name.alen
worker-2 executed Cargo ==> NO.1 Name.july
worker-1 executed Cargo ==> NO.2 Name.june
worker-0 executed Cargo ==> NO.2 Name.july
worker-2 executed Cargo ==> NO.2 Name.alen
worker-3 executed Cargo ==> NO.3 Name.june
worker-4 executed Cargo ==> NO.4 Name.june
worker-2 executed Cargo ==> NO.3 Name.alen
worker-3 executed Cargo ==> NO.3 Name.july
worker-4 executed Cargo ==> NO.5 Name.june
worker-1 executed Cargo ==> NO.6 Name.june
worker-0 executed Cargo ==> NO.4 Name.alen
worker-2 executed Cargo ==> NO.7 Name.june
worker-3 executed Cargo ==> NO.5 Name.alen
worker-2 executed Cargo ==> NO.4 Name.july
worker-4 executed Cargo ==> NO.6 Name.alen
worker-0 executed Cargo ==> NO.5 Name.july
worker-2 executed Cargo ==> NO.8 Name.june
worker-3 executed Cargo ==> NO.7 Name.alen
worker-1 executed Cargo ==> NO.6 Name.july
worker-4 executed Cargo ==> NO.8 Name.alen
worker-4 executed Cargo ==> NO.9 Name.june
worker-2 executed Cargo ==> NO.10 Name.june
worker-3 executed Cargo ==> NO.9 Name.alen
worker-1 executed Cargo ==> NO.7 Name.july
worker-2 executed Cargo ==> NO.10 Name.alen
worker-4 executed Cargo ==> NO.11 Name.alen
worker-3 executed Cargo ==> NO.11 Name.june
worker-0 executed Cargo ==> NO.8 Name.july
worker-4 executed Cargo ==> NO.12 Name.alen
worker-3 executed Cargo ==> NO.12 Name.june
worker-4 executed Cargo ==> NO.13 Name.alen
worker-1 executed Cargo ==> NO.9 Name.july
worker-2 executed Cargo ==> NO.14 Name.alen
worker-0 executed Cargo ==> NO.13 Name.june
worker-4 executed Cargo ==> NO.15 Name.alen
worker-2 executed Cargo ==> NO.10 Name.july
worker-1 executed Cargo ==> NO.14 Name.june
worker-3 executed Cargo ==> NO.15 Name.june
worker-4 executed Cargo ==> NO.16 Name.alen
worker-3 executed Cargo ==> NO.11 Name.july
worker-2 executed Cargo ==> NO.12 Name.july
worker-0 executed Cargo ==> NO.16 Name.june
worker-1 executed Cargo ==> NO.17 Name.june
worker-2 executed Cargo ==> NO.18 Name.june
worker-2 executed Cargo ==> NO.17 Name.alen
worker-4 executed Cargo ==> NO.13 Name.july
worker-0 executed Cargo ==> NO.18 Name.alen
worker-0 executed Cargo ==> NO.19 Name.june
worker-3 executed Cargo ==> NO.14 Name.july
worker-1 executed Cargo ==> NO.19 Name.alen
worker-2 executed Cargo ==> NO.20 Name.june
worker-3 executed Cargo ==> NO.21 Name.june
worker-0 executed Cargo ==> NO.15 Name.july
worker-3 executed Cargo ==> NO.20 Name.alen
worker-4 executed Cargo ==> NO.21 Name.alen
worker-3 executed Cargo ==> NO.22 Name.june
worker-1 executed Cargo ==> NO.16 Name.july
worker-2 executed Cargo ==> NO.17 Name.july
worker-0 executed Cargo ==> NO.23 Name.june
相关文章:
java 多线程之Worker Thread模式(Thread Pool模式)
Worker Thread模式 Worker的意思是工作的人,在Worker Thread模式中,工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来。 Worker Thread模式也被成为Background Threadÿ…...
4月17日星期四今日早报简报微语报早读
4月17日星期四,农历三月二十,早报#微语早读。 1、国家统计局:一季度国内生产总值同比增长5.4%; 2、我国博士后已超40万人,2024年招收人数再创新高; 3、神舟二十号计划近日择机实施发射,船箭组…...
【最新版】芸众商城独立版源码 425+插件 全新后台框架
一.系统介绍 芸众商城系统最新版 已经更新425全插件版,一套系统支持各种新零售、商城、模式,天天美丽链动商城。不要相信那些外面的旧版本。旧版本等于是废品,无法小程序运营的,框架还是旧的! 芸众系统最新版 服务器可…...
android liveData observeForever 与 observe对比
LiveData 是一个非常有用的组件,用于在数据变化时通知观察者。LiveData 提供了两种主要的观察方法:observe 和 observeForever。这两种方法在使用场景、生命周期感知以及内存管理等方面有所不同。 一、observe 方法 1. 基本介绍 生命周期感知:observe…...
定制化 Docsify 文档框架实战分享
🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…...
蓝桥杯题目:二维前缀和
首先分析一下二维数组的差分。s[x2][y2]-s[x1][y1]s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]s[x1-1][y1-1] 因为对于二维数组x2y2-x1y1范围内的值需要通过x2y2减去从x1,y2-1的这段存储的前缀和以及减去x2-1,y1这两部分的前缀和,但是还有一个x1-1&a…...
数字孪生城市技术应用典型实践案例汇编(22个典型案例)(附下载)
近年来,数字孪生技术在我国从战略框架逐步向系统性落地推进,成为推动数字中国建设的重要技术引擎。随着《数字中国建设整体布局规划》《"十四五"数字经济发展规划》《深化智慧城市发展推进城市全域数字化转型的指导意见》等政策的实施…...
Linux——信号(1)信号的产生
我们在讲进程的多种状态时提到过,一个进程的退出有三种情况:正常退出,结果出错退出(代码也执行完了),异常终止退出(代码未执行完),其中最后一种退出相当于进程在运行时&a…...
【模型常见评价指标(分类)】
目录 常见指标 其他的评估指标 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常见指标 其他的评估指标 3.1 BLEU BLEU(Bilingual Evaluation Understudy,双语评估替补)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质…...
个人博客系统后端 - 用户信息管理功能实现指南(上)
本文记录了如何实现用获取户信息,用户信息更新,用户头像上传三大基础功能 先上接口实现截图: 一、项目结构概览 先介绍一下 个人博客系统采用了标准的 Spring Boot 项目结构,用户功能相关的文件主要分布在以下几个目录:…...
CyberAgentAILab 开源数字人项目TANGO,heygen的开源版来了~
简介 TANGO 是 CyberAgentAILab 开源的一项前沿研究成果,其初衷在于探索高效生成模型在实际应用场景中的表现。项目诞生于 CyberAgent 在整合创意与人工智能的实践中,旨在为数字内容生成、交互和实时渲染等领域提供一个高性能、模块化、可扩展的解决方案…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 A 卷
上册期中同步测试卷A卷 一、单项选择题(本大题共5小题,每小题3分,总计15 分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计30分) 11. …...
4.16 AT好题选做
文章目录 前言[ARC103D] Distance Sums(确定树的形态,trick)[AGC062B] Split and Insert(区间 d p dp dp)[AGC012E] Camel and Oases(状压,可行性dp转最优性dp)[ARC094D] Normalization(trick,转化)[ARC125F] Tree Degree Subset Sum(结论,a…...
数据库-day06
一、实验名称和性质 分类查询 验证 综合 设计 二、实验目的 1.掌握数据查询的Group by ; 2. 掌握聚集函数的使用方法。 三、实验的软硬件环境要求 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: …...
基于Flask的漏洞挖掘知识库系统设计与实现
基于Flask的漏洞挖掘知识库系统设计与实现 一、系统架构设计 1.1 整体架构 本系统采用经典的三层Web架构,通过Mermaid图展示的组件交互流程清晰呈现了以下核心模块: 前端展示层:基于Bootstrap5构建响应式界面业务逻辑层:Flask…...
小白从0学习网站搭建的关键事项和避坑指南
以下是针对小白从零学习网站搭建时需要注意的关键事项和避坑指南,帮助你高效学习、少走弯路: 一、学习路径注意事项 不要跳过基础 误区:直接学习框架(如 React、Laravel)而忽视 HTML/CSS/JS 基础。 正确做法ÿ…...
OpenAI 推出一对 AI 推理模型 o3 和 o4-mini
OpenAI 于 2025 年 4 月 16 日(美国东部时间)宣布推出两款全新的 AI 推理模型——o3 与 o4-mini,它们能够在给出最终回答前进行思考与推理。 本文中所有的 ChatGPT 服务,由 ChatShare 镜像站 提供,无需担心网络和地区限…...
知识了解03——怎么解决使用npm包下载慢的问题?
1、为什么使用npm下载包会下载的慢 因为使用npm下载包时,默认使用国外服务器进行下载,此时的网络传输需要经过漫长的海底电缆,因此下载速度会变慢 2、怎么解决?(切换镜像源) (1)方…...
【网络】IP层的重要知识
目录 1.IP层的作用 2.主机和节点 3.网络层和数据链路层的关系 4.路由控制 4.1.路由控制的过程 4.2. IP地址与路由控制 4.3.路由控制表的聚合 4.4.静态路由和动态路由 4.5.动态路由的基础 5.数据链路的抽象化 5.1.数据链路不同,MTU则相异 5.2.路径MTU发…...
【随身WIFI】随身WiFi Debian系统优化教程
0.操作前必看 本教程基于Debian系统进行优化,有些操作对随身WiFi来说可能会带来负优化,根据需要选择。 所有操作需要在root用户环境下运行,否则都要加sudo 随身wifi Debian系统,可以去某安的随声WiFi模块自行搜索刷机 点赞&am…...
IPCC指南主要变化(各版本)
1996年IPCC国家温室气体清单指南 背景:是IPCC较早发布的指南之一,为国家温室气体清单编制提供了基础方法。 内容:包括了对温室气体排放源和汇的估算方法,涵盖了能源、工业、农业等多个部门。 2006年IPCC国家温室气体清单指南 背…...
关于Diamond机械手的运动学与动力学的推导
1.关于Diamond机械手 (1)位置模型推导 逆解:机械末端平台的位置与驱动关节之间的关系。 设p点在xy平面的坐标是(x,y)T,此时根据向量求解 OP等于向量r等于e向xy轴的向量主动臂长度向xy轴的向量…...
@JsonSerialize注解自定义序列化方式
JsonSerialize注解自定义序列化方式 文章目录 JsonSerialize注解自定义序列化方式**前言****创建自定义序列化器****应用自定义序列化器****测试序列化结果****高级用法:全局注册序列化器****关键点解析****常见问题解决****问题1:序列化结果不符合预期*…...
第二篇:linux之Xshell使用及相关linux操作
第二篇:linux之Xshell使用及相关linux操作 文章目录 第二篇:linux之Xshell使用及相关linux操作一、Xshell使用1、Xshell安装2、Xshell使用 二、Bash Shell介绍与使用1、什么是Bash Shell(壳)?2、Bash Shell能干什么?3、平时如何使…...
qt中关于思源雅黑字体的使用
首先,需要下载一份思源雅黑字体,我放在了下面位置,https://download.csdn.net/download/Littlehero_121/90631851 2、关于qt中的使用操作,如下: //QString path "绝对路径";QString path QCoreApplicatio…...
用 MongoIndexStore 实现对话存档和恢复 实现“多用户、多对话线程”场景(像一个 ChatGPT 对话列表那样)
用LlamaIndex写两个完整实用的案例! 实现如何用 MongoIndexStore 实现对话存档和恢复实现“多用户、多对话线程”场景(像一个 ChatGPT 对话列表那样) ✅ 案例一:使用 MongoIndexStore 实现对话存档 恢复 单用户 单对话线程&am…...
接口测试:实用指南4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
2000-2017年各省国有经济煤气生产和供应业固定资产投资数据
2000-2017年各省国有经济煤气生产和供应业固定资产投资数据 1、时间:2000-2017年 2、来源:国家统计局、能源年鉴 3、指标:行政区划代码、城市、年份、国有经济煤气生产和供应业固定资产投资 4、范围:31省 5、指标说明&#x…...
AOP的基本应用案例---统计每个函数的执行时间
1.导入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.准备好要计算的SpringBoot的项目(本案例以service的实现类为例) 3.编写AOP的代码: package c…...
前端复习遗忘的知识点
这个是我个人平常学习一些博主的东西,如果侵权请联系我或者让我标上博主平台等信息,谢谢! 1:如图涉及知识点jq: 1.获取元素 document.getElementById(""); document.getElementsByClassName(); document.g…...
Unity3d 6(6000.*.*)版本国区下载安装参考
前言 Unity3d 6.是最新的版本,是与来自世界各地的开发者合作构建、测试和优化的成果,现在可以完全投入生产,是我们迄今为止性能最出色、最稳定的 Unity 版本。Unity 6 有许多令人兴奋的新工具和功能:端到端多人游戏工作流程将加速…...
【JavaEE】Maven配置
一、Maven简介 什么是Maven? Maven是一个基于项目对象模型(POM)构建的自动化工具,主要用于Java项目构建、依赖管理和项目信息管理 我理解的Maven:自动下载和管理“代码零件”(比如别人写好的工具包&#x…...
Java排序算法百科全书:原理、实现与实战指南
一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]…...
大模型在教育领域的五大应用
大模型在教育领域的五大应用 随着人工智能技术的迅猛发展,特别是大模型(如GPT-3、BERT等)的出现,教育领域正迎来一场前所未有的变革。大模型不仅能够处理复杂的自然语言任务,还能够通过深度学习算法理解和生成高质量的…...
Lesson 12 Goodbye and good luck
Lesson 12 Goodbye and good luck 词汇 luck n. 运气,幸运 相关:lucky a. 幸运的 luckily ad. 幸运地 unlucky a. 不幸的 搭配:lucky number 幸运数字 lucky color 幸运色 lucky day 幸运日 lucky dog 幸运儿…...
数据结构-前缀树
一、引言 前缀树又叫字典树,可以快速查找字符串或字符串前缀出现的次数,方便进行前缀匹配、词频统计 二、字典树模型 现有一个字典树,里面有money、mother、salary、salary、say五个单词 其中根节点位置还没有字符,相当于空串&am…...
搭建 vue 项目环境详细步骤
在平常的开发工作中,我们经常需要对项目进行打包,后端项目打包及部署在前面总结过。那么,现在前端基本都是 vue 项目,那么应该如何搭建一个 vue 环境呢?下载一个前端项目应该如何启动呢?今天,我…...
【2025最新版】火鸟门户v8.5系统源码+PC、H5、小程序 +数据化大屏插件
一.介绍 火鸟地方门户系统V8.5源码 系统包含4端: PCH5小程序APP 二.搭建环境 系统环境:CentOS、 运行环境:宝塔 Linux 网站环境:Nginx 1.2.22 MySQL 5.6 PHP-7.4 常见插件:fileinfo ; redis 三.测…...
【eNSP实验】OSPF单区域配置
简介 OSPF(开放最短路径优先)是一种基于链路状态算法的内部网关协议(IGP),用于自治系统内部动态路由。其核心机制为:各路由器通过泛洪链路状态通告(LSA)同步网络拓扑,构…...
e实例性能测评:Intel Xeon Platinum处理器,经济型入门级服务器
阿里云服务器ECS经济型e系列是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,阿里云百科分享CPU处理器采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理器内存配…...
uniapp APP端 DOM生成图片保存到相册
<template> <view class"container" style"padding-bottom: 30rpx;"> <view class"hdbg pr w100 " style"height: 150rpx;"> <top-bar content分享 Back"Back"></top-b…...
Leetcode刷题 由浅入深之哈希表——242. 有效的字母异位词
目录 (一)字母异位词的C实现 写法一(辅助数组) (二)复杂度分析 时间复杂度 空间复杂度 (三)总结 【题目链接】242.有效的字母异位词 - 力扣(LeetCode) …...
Opencv函数及练习题
一、函数整理: 1、cv2.adaptiveThreshold() 2、 cv2.split() 3、cv2.merge() 4、cv2.add() 5、cv2.bitwise_and() 6、 cv2.inRange(&…...
16-算法打卡-哈希表-两个数组的交集-leetcode(349)-第十六天
1 题目地址 349. 两个数组的交集 - 力扣(LeetCode)349. 两个数组的交集 - 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1:输入:nu…...
计算机视觉——JPEG AI 标准发布了图像压缩新突破与数字图像取证的挑战及应对策略
概述 今年2月,经过多年旨在利用机器学习技术开发一种更小、更易于传输和存储且不损失感知质量的图像编解码器的研究后,JPEG AI国际标准正式发布。 来自JPEG AI官方发布流,峰值信噪比(PSNR)与JPEG AI的机器学习增强方法…...
【JavaWeb后端开发01】Maven入门
课程内容: 初始Maven Maven概述 Maven模型 Maven仓库介绍 Maven安装与配置 IDEA集成Maven 依赖管理 单元测试 文章目录 1. 初始Maven1.1 介绍1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Ma…...
【Leetcode】16. 最接近的三数之和
一、题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1: 输入:nums = [-1,2,1,-4], target = 1 输出:2解释: 与 target 最接近…...
目标检测概述
为什么基于卷积网络的目标检测模型在预测后要使用非极大值抑制 基于卷积网络的目标检测模型可能会在目标的相邻区域生成多个相互重叠框,每个框的预测结果都是同一个目标,引起同一目标的重复检测。造成这一现象的原因主要有两个, 基于卷积网络…...
摄影跟拍预定|基于java+vue的摄影跟拍预定管理系统(源码+数据库+文档)
摄影跟拍预定管理系统 目录 基于SprinBootvue的摄影跟拍预定管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3摄影师功能模块 4用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…...
--图--
并查集 并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述…...