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

java多线程(6.0)

目录

​编辑

阻塞队列

阻塞队列概念 

生产者消费者模型

阻塞队列的作用

阻塞队列的使用

 阻塞队列的实现 


阻塞队列

阻塞队列概念 

阻塞队列是一种特殊的队列,同样遵循“先进先出”的原则,支持入队操作和出队操作和一些基础方法。在此基础上,阻塞队列会在队列已满或队列为空时陷入阻塞,所以它具有如下特性:

  • 当队列已满时,继续入队列就会阻塞,直到有其他线程从队列中取走元素。
  • 当队列为空时,继续出队列也会阻塞,直到有其他线程向队列中插入元素。
  • 并且它是线程安全的,就是多线程中使用它是不会引发线程安全bug的

那么我们用它是干嘛呢?一般用它实现生产者消费者模型,对于该概念我们下面详细说下:

生产者消费者模型

生产者消费者模型有两种角色,生产者和消费者,两者之间通过缓冲容器来达到解耦合削峰填谷的效果。类似于厂商和客户与中转仓库之间的关系,如下图:

厂家生产的商品堆积在中转仓库,当中转仓库满时,入仓阻塞,当中转仓库为空时,出仓阻塞。通过上述结构,生产者和消费者摆脱了“产销一体”的运作模式,即解耦合。同时,无论是客户需求暴增,还是厂家产量飙升,都会被中央仓库协调,避免突发情况导致结构崩溃,达到削峰填谷的作用。

同理,根据生产者消费者模型,我们将线程带入到消费者和生产者的角色,阻塞队列带入到缓冲空间的角色,一个类似的模型很容易就搭建起来了。

阻塞队列的作用

①解耦合

作为生产者消费者模式的缓冲空间,将线程(其他)之间分隔,通过阻塞队列间接联系起来,起到降低耦合性的作用,这样即使其中一个挂掉,也不会使另一个也跟着挂掉。(就是降低它们之间的联系性)

②削峰填谷

因为阻塞队列本身的大小是有限的,所以能起到一个限制作用,即在消费者面对突发暴增的入队操作,依然不受影响。

 如电商平台在每年双十一时都会出现请求峰值的情况,如下:

而假设电商平台对请求的处理流程是这样的:

  • 因为处理请求需要消耗硬件资源,如果没有消息队列,面对双十一这种请求暴增的情况,请求处理服务器很可能就直接挂掉了。
  • 而有了消息队列之后,请求处理服务器不必直接面对大量请求的冲击,仍旧可以按原先的处理速度来处理请求,避免了被冲爆,这就是‘削峰’。
  • 没有被处理的请求也不是不处理了,而是当消息队列有空闲时再继续流程,即高峰请求被填在低谷中,这就是‘填谷’

阻塞队列的使用

在 Java 标准库中就提供了现成阻塞队列这样的数据结构:BlockingQueue ,这里 BlockingQueue 是一个接口,实现这个接口的类也有很多:

  1. ArrayBlockingQueue: 基于数组的阻塞队列。
  2. LinkedBlockingQueue: 基于链表的阻塞队列。
  3. PriorityBlockingQueue: 支持优先级的阻塞队列。

阻塞队列一般用put和take方法
put 方法用于阻塞式的入队列, take 用于阻塞式的出队列. BlockingQueue 也有 offer, poll, peek 等方法, 但是这些方法不带有阻塞特性,所以不用

 阻塞队列的实现 

实现阻塞队列,我们可以从浅到深的来实现,先实现一个普通队列,再在普通队列的基础上,添加上线程安全,再增加阻塞功能,那么就来普通队列的实现吧。这里我们实现一个环形队列(之前讲过怎么实现,这里直接给代码)

java数据结构之队列_java队列底层数据结构-CSDN博客

class MyBlockingQueue {//对象公用锁private Object lock = new Object();//String类型的数组,存储队列元素private String[] elems = null;//队首位置private int head = 0;//队尾位置private int tail = 0;//存储的元素个数private int size = 0;//构造方法,用于构建定长数组,数组长度由参数指定public MyBlockingQueue(int capacity) {elems = new String[capacity];}//入队方法public void put(String elem) throws InterruptedException {synchronized(lock) {//已满时入队操作阻塞while(size == elems.length) {lock.wait();}//将元素存入队尾elems[tail] = elem;//存入后,队尾位置后移一位tail++;//实现环形队列的关键,超过数组长度后回归数组首位if(tail >= elems.length) {//回归数组首位tail = 0;}//存入后元素总数加一size++;//当出队操作阻塞时,入队后为其解除阻塞//(入队后队列不为空了)lock.notify();}}//出队方法public String tack() throws InterruptedException {//存储取出的元素,默认为nullString elem = null;synchronized (lock) {//队列为空时出队操作阻塞while (size == 0) {lock.wait();}//出队,取出队首值(不用置空,队尾存入时覆盖)elem = elems[head];//出队后,队首位置后移一位head++;//实现环形队列的关键,超过数组长度后回归数组首位if(head == elems.length) {//回归数组首位head = 0;}//存入后元素总数加一size--;//当入队操作阻塞时,出队后为其解除阻塞//(出队后队列不满)lock.notify();}//返回取出的元素return elem;}
}

在普通队列上再进行修改,修改思路是这样

  • 首先,我们上述代码中用的是if而非while,但是wait被唤醒的方法不止notify一种,它还可能被interrupt所‘唤醒’,这样的话可能队列还是空的或者满的就进行的取和入的操作,所以要用while,再进行一次判断,判断它是不是由于notify所唤醒
  • 再者,如果这里用的的try catch的话,用if和while的区别就很大了,因为用throw抛出异常的话,会直接报错,而用try case捕捉异常的话就没有报错,后面会留下祸患。

还有一个问题,因为我们在进行实现代码的时候,会进行多次判断例如:

这样的判断,当t1进行读取内存中的数据的时候,t2可能刚修改完cpu中的数据,还没来的及去修改内存中的数据,这样的话,t1就还是原来的size,这个就是内存可见性的案例,所以我们可以在变量前面添加volatile进行修饰,来避免这个问题

综上所述,我们得出的最终代码如下所示

package thread;// 此处不考虑泛型参数, 只是基于 String 进行存储.
class MyBlockingQueue {private String[] data = null;private volatile int head = 0;private volatile int tail = 0;private volatile int size = 0;private Object locker = new Object();public MyBlockingQueue(int capacity) {data = new String[capacity];}public void put(String s) throws InterruptedException {// 加锁的对象, 可以单独定义一个, 也可以直接就地使用 this.synchronized (this) {while (size == data.length) {// 队列满了// return;this.wait();}data[tail] = s;tail++;if (tail >= data.length) {tail = 0;}size++;this.notify();}}public String take() throws InterruptedException{String ret = "";synchronized (this) {while (size == 0) {// 队列为空// return null;this.wait();}ret = data[head];head++;if (head >= data.length) {head = 0;}size--;this.notify();}return ret;}
}public class Demo28 {public static void main(String[] args) {MyBlockingQueue queue = new MyBlockingQueue(1000);// 生产者线程Thread t1 = new Thread(() -> {int i = 1;while (true) {try {queue.put("" + i);System.out.println("生产元素 " + i);i++;// 给生产操作, 加上 sleep, 生产慢点, 消费快点Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});// 消费者线程Thread t2 = new Thread(() -> {while (true) {try {Integer i = Integer.parseInt(queue.take());System.out.println("消费元素 " + i);// 给消费操作, 加上 sleep, 生产快点, 消费慢点// Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();t2.start();}
}

相关文章:

java多线程(6.0)

目录 ​编辑 阻塞队列 阻塞队列概念 生产者消费者模型 阻塞队列的作用 阻塞队列的使用 阻塞队列的实现 阻塞队列 阻塞队列概念 阻塞队列是一种特殊的队列,同样遵循“先进先出”的原则,支持入队操作和出队操作和一些基础方法。在此基础上&#…...

tkinter的文件对话框:filedialog

诸神缄默不语-个人技术博文与视频目录 文章目录 一、前言二、tkinter.filedialog模块详解2.1 模块导入方式2.2 通用参数说明 三、五大核心函数实战3.1 选择单个文件 - askopenfilename()3.2 多文件选择 - askopenfilenames()3.3 保存文件对话框 - asksaveasfilename()3.4 选择目…...

HOW - 如何模拟实现 gpt 展示答案的交互效果

文章目录 产品设计维度核心目标实现方式主要靠一些技巧1. 用 emoji 做语义锚点2. 每个段落只传达一件事3. 有节奏地对话式切换4. 使用 Markdown 风格来排版5. 用“你”而不是“用户”说话 如果想实现类似体验(比如写文档、教程、产品介绍) 前端开发维度想…...

达梦数据库压力测试报错超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE解决

1.名词解释:达梦数据库中的HJ_BUF_GLOBAL_SIZE是所有哈希连接操作可用的最大哈希缓冲区大小,单位为兆字节(MB) 2.达梦压测报错: 3.找到达梦数据库安装文件 4.压力测试脚本 import http.client import multiprocessi…...

第11章 面向分类任务的表示模型微调

​​​​​​第1章 对大型语言模型的介绍第2章 分词和嵌入第3章 解析大型语言模型的内部机制第4章 文本分类第5章 文本聚类与主题建模第6章 提示工程第7章 高级文本生成技术与工具第8章 语义搜索与检索增强生成第9章 多模态大语言模型第10章 构建文本嵌入模型第12章 微调生成模…...

c#加密证件号的中间部分,改为*号

前言 使用场景:在我项目中,我需要给前端提供接口,所以我要吧证件号进行加密。例如:411421199510225612,这是一个身份证号,18为的,那么我加密完成之后就会是 411421********5612,类似…...

qt中写一个简易的计算器

以下是添加了详细代码注释的版本&#xff1a; cpp #include <iostream>using namespace std;定义加法函数&#xff08;已注释掉&#xff09; //int add(int a, int b) { // return a b; //}定义减法函数&#xff08;已注释掉&#xff09; //int min(int a, int b) {…...

[特殊字符] Docker 从入门到实战:全流程教程 + 项目部署指南(含镜像加速)

Docker 是现代 DevOps 的基石&#xff0c;应用广泛于微服务、CI/CD、K8s、云原生等场景。本文将从 0 到 1 手把手带你掌握 Docker 的核心知识点&#xff0c;并完成 Java Nginx 项目部署&#xff0c;适合新手与进阶开发者阅读与实战。 &#x1f4da; 目录 Docker 快速入门 入门…...

《R语言SCI期刊论文绘图专题计划》大纲

今天开始&#xff0c;我将和大家分享系统且详细的《R语言SCI期刊绘图专题教程》&#xff0c;内容会从基础到高阶应用&#xff0c;从配色美学到顶刊风格复现&#xff0c;确保大家可以学到高质量内容&#xff01;下面是大纲。 &#x1f4da;《R语言SCI期刊论文绘图专题计划》 第…...

从氛围到节奏:情绪化配乐网站指南

在影视、短视频、广告甚至游戏开发中&#xff0c;配乐的作用早已超越了简单的背景音效&#xff0c;它能够深刻地影响观众的情绪&#xff0c;为作品注入灵魂。但如何找到那些能够精准传达情绪、完美契合画面的配乐呢&#xff1f;今天&#xff0c;就让我们一起探索那些能够助力你…...

矩阵运营:抢占市场与流量的利器

还在为无法超越行业老大而苦恼&#xff1f;还在为市场份额难以扩大而焦虑&#xff1f;还在为流量匮乏、客资不足而发愁&#xff1f;别担心&#xff0c;矩阵运营就是你突破困局的关键&#xff01; 一、矩阵运营&#xff1a;颠覆传统的运营模式 在当今竞争激烈的商业环境中&…...

【2025最新面试操作系统八股】CPU利用率和load(负载)的区别,CPU利用率怎么算。

总结 负载&#xff08;Load&#xff09;和 CPU 利用率是衡量系统性能的两个不同的指标&#xff0c;它们从不同的角度反映了系统的状态。 CPU 利用率表示 CPU 正在执行指令的时间比例&#xff0c;即 CPU 忙碌的程度。它是一个百分比值&#xff0c;表示在某个时间间隔内&#x…...

ApplicationRunner的run方法与@PostConstruct注解

ApplicationRunner 的 run 方法与 PostConstruct 注解在 Spring Boot 中均用于初始化逻辑&#xff0c;但二者的 执行时机、作用范围 和 功能特性 存在显著差异。以下是详细对比分析&#xff1a; 一、核心差异对比 维度PostConstructApplicationRunner.run()触发时机Bean 实例化…...

【leetcode刷题日记】lc.73-矩阵置零

目录 1.题目 2.代码 1.题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]…...

配置 RDP 远程桌面协议连接ubuntu服务器桌面

文章目录 一、简介二、服务安装三、桌面安装小结 一、简介 RDP&#xff08;Remote Desktop Protocol&#xff0c;远程桌面协议&#xff09;是微软开发的一种专有协议&#xff0c;用于在网络上实现远程桌面访问&#xff0c;允许用户通过客户端设备&#xff08;如 Windows、Linu…...

统计文件中单词出现的次数并累计

# 统计单词出现次数 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8") f1file.read() # 读取文件 countf1.count("is") # 统计文件中is 单词出现的次数 print(f"此文件中单词is出现了{count}次")# 2.判断单词出…...

【初识Trae】字节跳动推出的下一代AI原生IDE,重新定义智能编程

​ 初识官网文档 从官网可以看到有两个大标签页&#xff0c;即Trae IDE CN和Trae插件&#xff0c;这就说明Trae在发布Trae IDE的同时考虑到对主流IDE的插件支持&#xff0c;这一点非常有心&#xff0c;但是我估测Trae IDE的体验更好&#xff08;就是AI IDE出生&#xff0c;毕…...

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

前端技术Ajax实战

1.1 案例_图书管理-介绍 目标 掌握图书管理案例的增删改查业务和 Bootstrap 弹框的使用。 讲解 1. 运行图书管理案例效果 展示增删改查业务效果&#xff0c;并使用 Bootstrap 弹框承载表单。 2. 分析步骤 学习 Bootstrap 弹框&#xff08;用于添加和编辑图书&#xff09…...

ctfshow web入门 命令执行(29-77)

Web 命令执行是指攻击者借助Web应用程序里的漏洞&#xff0c;在服务器端执行任意系统命令的一种攻击手段。 原理&#xff1a; Web 应用程序在处理用户输入时&#xff0c;有时会调用系统命令。若开发人员没有对用户输入进行严格的过滤与验证&#xff0c;攻击者就能够通过构造恶意…...

Mac「brew」快速安装Redis

安装Redis 步骤 1&#xff1a;安装 Redis 打开终端&#xff08;Terminal&#xff09;。 运行以下命令安装 Redis&#xff1a; brew install redis步骤 2&#xff1a;启动 Redis 安装完成后&#xff0c;可以使用以下命令启动 Redis 服务&#xff1a; brew services start redis…...

非对称电容减重实验

加载高压的非对称电容在变压器油中的减重实验 早年国外流传飘升机&#xff08;Lifter&#xff09;的视频。爱好者们用简单的材料制作了非对称电容&#xff0c;通高压直流电&#xff0c;它就能飘起来。 所谓的飘升机&#xff0c;就是一种非对称电容。它由面积相差极大的两个极板…...

day37图像处理OpenCV

文章目录 一、图像预处理19 霍夫变换19.1 理解霍夫变换19.2 (标准)霍夫直线变换19.3 统计概率霍夫直线变换19.4 霍夫圆变换 一、图像预处理 19 霍夫变换 19.1 理解霍夫变换 霍夫变换是图像处理的一种技术&#xff0c;主要用于检测图像中的直线、圆等几何形状。基本思想就是将…...

23种设计模式-行为型模式之责任链模式(Java版本)

Java 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;详解 &#x1f9e0; 什么是责任链模式&#xff1f; 责任链模式是一种行为型设计模式&#xff0c;它使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者与接收者之间的耦合关系。将这些对象…...

机器学习的基本概念

机器学习是人工智能的一个重要研究领域。与计算机科学、心理学等多种学科都有密切的关系&#xff0c;牵涉的面比较宽&#xff0c;而且许多理论及技术上的问题尚处于研究之中&#xff0c;接下来对它的一些基本概念和方法作一简要讨论&#xff0c;以便对它有一个初步的认识。 一…...

【6】GD32 高级通信外设 CAN、USBD

高级通信外设&#xff1a;CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用...

手工收集统计信息

有时想对某些表收集统计信息 CREATE OR REPLACE PROCEDURE GATHER_STATS ASDECLAREV_SQL1 VARCHAR(1000);--表游标CURSOR C1 ISSELECT (SELECT USER) AS TABLE_OWNER,TABLE_NAMEFROM USER_TABLES; --可以在这里加过滤条件--索引游标CURSOR C2 ISSELECT TABLE_OWNER,INDEX_NAM…...

隧道调频广播覆盖的实现路径:隧道无线广播技术赋能行车安全升级,隧道汽车广播收音系统助力隧道安全管理升级

隧道调频广播覆盖的实现路径:隧道无线广播技术赋能行车安全升级,隧道汽车广播收音系统助力隧道安全管理升级 北京海特伟业科技有限公司任洪卓发布于2025年4月23日 在现代交通基础设施建设中&#xff0c;隧道作为公路、铁路等交通网络的重要组成部分&#xff0c;其内部通信系统…...

深度强化学习(DRL)实战:从AlphaGo到自动驾驶

——从算法原理到产业落地的全链路解析 摘要 本文通过算法对比矩阵、训练流程图解、Python代码实战及产业应用解析&#xff0c;构建从理论创新到工程落地的完整技术栈。实验数据显示&#xff1a;采用PPO算法训练的7自由度机械臂抓取成功率达92%&#xff0c;基于改进型DQN的自…...

【数据可视化-33】病毒式社交媒体潮流与用户参与度可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

ubuntu使用dify源码安装部署教程+避坑指南

很多人,包括我在最初使用dify的时候都习惯使用docker来部署安装环境,但在二次开发使用过程中,我们可能希望使用源码来安装,那么这篇文章我将给大家分享如何在ubuntu系统下使用源码安装,并提供大家遇到的疑难杂症如下: dify安装使用过程中报错:/console/api/workspaces/…...

软件技术专业

软件技术专业是一个专注于软件开发、测试、维护及相关技术的学科专业。以下是其相关介绍&#xff1a; 专业概述 软件技术专业主要培养具备扎实的软件理论基础和较强的实践能力&#xff0c;能熟练掌握软件开发工具和技术&#xff0c;从事软件设计、开发、测试、维护等工作的高素…...

AI数据分析的利器:解锁BI工具的无限潜力

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最宝贵的资产之一。如何高效、准确地分析这些数据&#xff0c;挖掘其中的价值&#xff0c;成为企业决策的关键。AI数据分析&#xff0c;作为新时代的数据分析利器&#xff0c;正逐渐改变着企业的决策方式。而BI&#xff0…...

docker 代理配置冲突问题

问题描述 执行 systemctl show --property=Environment docker 命令看到有如下代理配置 sudo systemctl show --property=Environment docker Environment=HTTP_PROXY=http://127.0.0.1:65001 HTTPS_PROXY=http://127.0.0.1:65001 NO_PROXY=127.0.0.1,docker.io,ghcr.io,uhub…...

清理HiNas(海纳斯) Docker日志并限制日志大小

我在一个机顶盒的HiNas系统上跑Octoprint的docker版本&#xff0c;每隔一段时间盒子空间就被占完了&#xff0c;运行df -h之后&#xff0c;显示/dev/root Use 100%。 Filesystem Size Used Avail Use% Mounted on /dev/root 6.6G 6.6G 0 100% / devtmpfs …...

kafka整合flume与DStream转换

一、Kafka整合flume cd /opt/software/flume/conf/ vi flume-kafka.conf a1.sourcesr1 a1.sinksk1 a1.channelsc1 a1.sources.r1.typespooldirt a1.sources.r1.spoolDir/root/flume-kafka a1.sinks.k1.typeorg.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.kafka.to…...

第2讲:R语言中的色彩美学——科研图表配色指南

目录 一、背景导引:科研图表为何需要“配色讲究”? 二、色彩基础认知:别让“红绿盲”错过你的科研成果 三、R语言中的配色库全景图 四、案例演示与代码实战 🎨案例1:ggplot2 + viridis 配色的热图 🎨案例2:MetBrewer 中的印象派色彩 五、技巧点拨:如何为SCI图…...

C++入门小馆: 深入了解STLlist

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

Float32、Float16、BFloat16

我们先介绍 Float32、Float16、BFloat16 的 浮点数表示方法 然后根据浮点数表示&#xff0c;来分析总结他们是怎么控制 精度和 数值范围 的 最后再来对比的说明 Float32、Float16、BFloat16 的 应用场景 和 硬件支持 1、浮点数的表示方法 Float32 &#xff1a; 单精度浮点数…...

多模态深度学习: 从基础到实践

多模态深度学习: 从基础到实践 多模态学习是人工智能领域的前沿方向&#xff0c;它允许模型同时处理和理解多种数据类型。本文将介绍多模态学习的核心概念&#xff0c;以及如何在实际项目中应用这些技术。 什么是多模态学习&#xff1f; 多模态学习涉及处理和整合来自不同来…...

Java学习手册:时间戳、时区等相关概念

一、时间戳 定义 &#xff1a;时间戳是指以秒或毫秒为单位&#xff0c;表示自 1970 年 1 月 1 日 00:00:00 UTC&#xff08;协调世界时&#xff09;以来的 elapsed time。它是衡量时间的一种方式&#xff0c;常用于系统开发中记录事件的发生顺序和具体时间。作用 &#xff1a;…...

Axure全局变量的含义与基础应用

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:全局变量 主要内容:全局变量含义、基础应用 应用场景:元件赋值 案例展示: 案例视频:...

Java 24 深度解析:云原生时代的性能更新与安全重构

一、Java 24 核心特性全景图 Java 24 于 2025 年 3 月正式发布&#xff0c;带来 24 项核心改进&#xff0c;覆盖性能优化、安全性增强、语言升级和云原生支持四大领域。以下是关键特性的全景式解析&#xff1a; 1. 性能优化&#xff1a;从内存到并发的全方位突破 紧凑对象头&…...

ubuntu(28):ubuntu系统多版本conda和多版本cuda共存

0. cuda(包括cudnn)、conda安装照常 注意&#xff1a; &#xff08;1&#xff09;多个conda不要安装到一个目录了&#xff0c;可以见下面的示例目录&#xff1b; &#xff08;2&#xff09;cuda&#xff08;包括cudnn&#xff09;不用纠结是否添加超链接 1. 需要修改环境配置…...

28、.NET 中元数据是什么?

在.NET中&#xff0c;元数据&#xff08;Metadata&#xff09;是描述程序结构和类型信息的二进制数据集合&#xff0c;它是.NET运行时&#xff08;CLR&#xff09;的核心基础组件之一&#xff0c;用于支持程序加载、类型解析、反射、安全校验等关键功能。以下是其核心特性和作用…...

插入html文件,让数据可视化彰显高端大气-Excel易用宝

我们老板整了个html文件的图表&#xff0c;说是html文件图表兼容性更好&#xff0c;现在让我将这个html文件的图表插入到Excel中。 其实这事也简单哈&#xff0c;通过插入web控件&#xff0c;就可以将HTML文件插入到工作表中。 单击【易用宝plus】→【插入Web控件】。 单击【…...

基于HTML+CSS实现的动态导航引导页技术解析

基于HTMLCSS实现的动态导航引导页技术解析 效果展示 核心技术实现 1. 视差背景层 #sence {position: fixed;width: 100vw;height: 100vh;z-index: -1; }#background {width: 140%;height: 140%;position: absolute;background-size: cover;filter: brightness(0.6);animatio…...

【编译原理】 第四章 自上而下语法分析

目录 语法分析器的功能 不确定的自上而下分析 确定的自上而下分析 LL(1)文法 左递归的消除 间接左递归的消除 消除文法中全部左递归的算法 消除回溯、提左因子 FIRST集 FOLLOW集 预测分析法 递归下降分析法 语法分析器的功能 按照文法从源程序单词串&#xff08;符…...

vue入门

Vue入门 目录: 导入快速入门 什么是Vue为什么要学Vue面试题&#xff1a;Vue的特定Vue要学习什么 Vue常用指令 指令介绍表单绑定文本插值绑定属性条件渲染列表渲染事件绑定总结 0.导入 0.1什么是Vue Vue.js&#xff0c;通常称为Vue&#xff0c;是一个用于构建用户界面的渐…...

Unity开发者快速认识Unreal 的BluePrint(二)

前言 前一篇是通过UMG编辑器制作的一个简单ui功能&#xff0c;记录Unity开发者使用BluePrint需要特别注意的地方,这一篇是分析和理解对于场景中的3D物体交互的BluePrint怎么制作&#xff0c;以及需要注意的一些关键点&#xff01;个人觉得最快的学习方式就是对比&#xff0c;入…...