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

JAVA阻塞队列

目录

一、什么是阻塞队列?特点是什么?

二、阻塞队列的两种创建方式:

1、使用 ArrayBlockingQueue<>( ) :

2、使用 LinkedBlockingQueue<>( ) :

三、阻塞队列方法的使用:

 阻塞队列关键的两个方法:

使用实例:

四、阻塞队列的使用场景:

1、公司服务器

2.生产者消费者模型:

 生产速度与消费速度一样:

  生产速度比消费速度慢:

生产速度比消费速度快:

五、模拟实现生产者消费者模型:

 实现代码:


一、什么是阻塞队列?特点是什么?

       在JAVA里,阻塞队列是一种特殊的队列,阻塞队列在普通队列的基础上,增加了阻塞的特性,也就是说:

        当队列满时,尝试向队列中插入元素的线程会被阻塞,直到队列有空间可用;当队列空时,尝试从队列中获取元素的线程会被阻塞,直到队列中有元素可用。

        阻塞队列 是 java.util.concurrent 包下的,使用时需要导包:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

        并且,阻塞队列是线程安全的。

二、阻塞队列的两种创建方式:

1、使用 ArrayBlockingQueue<>( ) :

// 创建一个容量为 10 的 ArrayBlockingQueue
BlockingQueue<Integer> arrayQueue = new ArrayBlockingQueue<>(10);

         这种方法基于 数组 实现,创建 ArrayBlockingQueue<>( ) 时,需要指定阻塞队列的容量,这意味着它的底层数组容量大小是固定的,后续无法动态改变。 

        

2、使用 LinkedBlockingQueue<>( ) :

// 创建一个有界的 LinkedBlockingQueue,容量为 20
BlockingQueue<Integer> boundedLinkedQueue = new LinkedBlockingQueue<>(20);// 创建一个无界的 LinkedBlockingQueue
BlockingQueue<Integer> unboundedLinkedQueue = new LinkedBlockingQueue<>();

        这些方法基于 链表 实现,第一种创建有界队列(上面的指定容量为 20,当队列满了之后再尝试放入元素,队列不会进行扩容);

                也可以创建无界队列(默认情况下,其最大容量为 Integer.MAX_VALUE)。

        所以,无界的LinkedBlockingQueue是不是可以无限放置元素?

        从理论上来说,无界的 LinkedBlockingQueue 可以不断地放置元素,因为它的默认最大容量为Integer.MAX_VALUE,这是一个非常大的数,在实际应用中通常可以认为是无界的。

        然而,在实际情况中,它并不能真正无限地放置元素。这是因为虽然队列本身没有严格的容量限制,但服务器的内存是有限的。随着元素不断添加,LinkedBlockingQueue 会不断占用内存空间,当内存被耗尽时,系统会抛出异常。

三、阻塞队列方法的使用:

 阻塞队列关键的两个方法:

//往队列放元素,队列满时会阻塞,直到有空位
put();//把队列元素取出,队列为空时会阻塞,直到队列不为空
take();

         put 方法用于阻塞式的入队列,take 用于阻塞式的出队列。

        

         BlockingQueue 也有 offer, poll, peek 等方法, 但是这些方法不带有阻塞特性。

使用实例:

public class Demo14 {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);// 入队列queue.put("aaa");System.out.println("添加一个元素");queue.put("bbb");System.out.println("添加一个元素");//出队列String s = queue.take();System.out.println("获取到一个元素: " + s);s = queue.take();System.out.println("获取到一个元素: " + s);s = queue.take();System.out.println("获取到一个元素: " + s);}
}

        可以看到,第三次调用 queue.take() 方法时会发生阻塞。因为此时队列中已经没有元素了。take 方法的特性是,如果队列为空,它会阻塞当前线程,直到队列中有元素可供取出。所以,此时线程会被阻塞,程序会停在这里等待新元素被添加到队列中。


       

四、阻塞队列的使用场景:

1、公司服务器

        有个公司,接收客户端的消息请求,公司机房的几台服务器用于处理这些消息:

此时,A B C 之间是直接调用关系,耦合度比较大。耦合度大可以体现在:

1. 如果 C 这个模块修改了,B 可能也要配合修改。

3. 如果公司机房要增加一个 D(如下图) ,那么针对 B 也需要进行修改。

 

        还有一个问题,就是如果 客户端发送的请求 很多,A 服务器收到多大的压力 ,此时 服务器 B C D 收到的压力是相同的,如果 一旦某个服务器顶不住了,那么这公司机房的 这个系统就崩溃了。因为各个服务器的耦合度太高了。

        那么,有什么方法可以解决这些问题?

        可以这样:

        

        这样,通过一个阻塞队列;如果 C 产生变动,或者再增添服务器(E,F,G......), 对于 B 的影响就很小了。

        并且,如果客户端发送的请求 很多,那么服务器A的压力只会给到B,服务器 C 和 D 被 消息队列(阻塞队列)保护起来了。然后再由服务器 C 和 D 慢慢的来处理每个请求,这样做可以有效进行 "削峰",防止服务器被突然到来的一波请求直接冲垮。

        但是这样也不是没有缺点的,如果引入的消息队列(阻塞队列)过多,不仅会使得系统复杂,还会增加网络开销。

2.生产者消费者模型:

 生产速度与消费速度一样:

public class Demo15 {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue = new LinkedBlockingQueue<>(100);//生产者线程Thread producer = new Thread(() -> {int count = 0;try {while (true) {queue.put("" + count);System.out.println("生产了一个元素: " + count);count++;//设置生产速度Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}});//消费者线程Thread consumer = new Thread(() -> {try {while (true) {String elem = queue.take();System.out.println("消费了一个元素: " + elem);//设置消费速度Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}});producer.start();consumer.start();producer.join();consumer.join();}
}

         由于生产者和消费者的速度相同,队列中的元素数量会保持相对稳定。这样能保证系统处于一种稳定的运行状态,不会出现队列满或者队列空的情况。

  生产速度比消费速度慢:

public class Demo15 {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue = new LinkedBlockingQueue<>(100);//生产者线程Thread producer = new Thread(() -> {int count = 0;try {while (true) {queue.put("" + count);System.out.println("生产了一个元素: " + count);count++;//设置生产速度Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}});//消费者线程Thread consumer = new Thread(() -> {try {while (true) {String elem = queue.take();System.out.println("消费了一个元素: " + elem);//设置消费速度//Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}});producer.start();consumer.start();producer.join();consumer.join();}
}

         上述代码中,生产速度比消费速度慢。这是因为生产者线程每次生产一个元素后会休眠 1000 毫秒,而消费者线程在取出元素后并没有休眠操作,会持续不断地尝试从队列中取出元素进行消费。

        由于生产者每 1 秒才生产一个元素,而消费者会持续不断地尝试从队列中取元素,所以大部分时间队列中最多只有一个元素。当生产者生产出一个新元素放入队列时,消费者会马上将其取出。(也就是消费线程拿了一个元素,然后阻塞等待,直到生产线程一秒后又生产了一个元素,消费线程再消费......)。

生产速度比消费速度快:

public class Demo15 {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue = new LinkedBlockingQueue<>(100);//生产者线程Thread producer = new Thread(() -> {int count = 0;try {while (true) {queue.put("" + count);System.out.println("生产了一个元素: " + count);count++;//设置生产速度//Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}});//消费者线程Thread consumer = new Thread(() -> {try {while (true) {String elem = queue.take();System.out.println("消费了一个元素: " + elem);//设置消费速度Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}});producer.start();consumer.start();producer.join();consumer.join();}
}

这段截图是后面的运行情况。

        消费了一个元素 :0 这个打印结果,出现在代码刚开始跑的时候出现,因为刚开始时队列为空,生产的元素 0 刚被放进队列就被消费线程取出来打印了,然后消费线程等待 1 秒期间,由于队列容量只有100,所以生产线程就只能立刻生产到 100 个元素后处于阻塞状态,一秒后,消费线程继续执行。再消费打印 消费了一个元素 :1

五、模拟实现生产者消费者模型:

 实现代码:

//模拟实现生产者消费者模型
class MyBlockingQueue {private String[] arr = null;//数组起始下标private int head = 0;//数组结束下标private int end = 0;//记录有效元素个数private int size = 0;//锁对象private Object locker = new Object();//构造数组大小public MyBlockingQueue(int num) {arr = new String[num];}//线程放置元素public void put(String elem) throws InterruptedException {synchronized (locker) {//如果队列满了while (size >= arr.length) {locker.wait();}arr[end] = elem;end++;//判断 end 是否到了末尾if(end >= arr.length) {end = 0;}//有效元素加一size++;//唤醒 take 的阻塞locker.notify();}}//线程取走元素public String take() throws InterruptedException {synchronized (locker) {//如果队列为空while (size <= 0) {locker.wait();}//得到队列最前面的元素String ret = arr[head];head++;//判断 head 是否到了末尾if(head >= arr.length) {head = 0;}//有效元素减一size--;//唤醒 put 的阻塞locker.notify();//返回队列最前面的元素return ret;}}
}

        我们使用了一个循环数组,当元素到末尾时,会走到起始的位置(文章之前有讲过,在JAVA数据结构部分的循环队列),实现了 put 方法和 take 方法。

这里解决几个问题:

1、为什么判断数组是否为空和是否为满的情况,用到 size >= arr.length 和 size <= 0 ?

        这里使用了防御性编程,原则上我们写的这个代码是不会出现 size > arr.length 和 size < 0的情况,直接使用 size == arr.length 和 size == 0就行了,上述代码这么做是更稳健的做法

2、为什么把 put 方法和 take 方法各自都加上了synchronized 锁?

        因为对于上述的两个方法中,如果有多个线程参与其中一个方法,会涉及到多线程修改同一个变量的操作(比如上述代码的 size 变量);这个操作会出问题的,会引发线程安全问题。

        还有就是,一个线程使用 put 方法,另一个线程使用 take 方法,也会涉及到修改同一个变量的操作(比如上述代码的 size 变量);

        综上所述,加了锁,确保同一时刻只有一个线程参与某个方法

3、为什么使用了 wait 和 notify 这些会阻塞方法?

        上述代码中,假如 A 线程使用 put 方法时,如果此时的数组满了,就需要阻塞等待并释放当前的锁,直到有元素被 take 走了之后,再被唤醒继续执行 put 操作,那么,谁来唤醒线程 A 呢?肯定是执行 take 方法的另一个线程 B ,当线程 B 获取锁然后 take 走一个元素后,就可以唤醒此时的线程 A 了,线程 A 再 put 一个元素。

        所以,上述的 put 方法的 notify 就是唤醒执行 take 方法的线程,take方法的 notify 就是唤醒执行 put 方法的线程,是相互的。

4、为什么判断 为什么判断数组是否为空和是否为满的情况 使用while循环?

        假如对于正常执行 put 方法的线程 A ,进入 wait 之前,肯定是会判断一次条件,写成 while ,当 wait 被唤醒之后,还需要再判断一次条件。

        正常来说,肯定是条件被打破了,线程 A 才能被唤醒,也就是其他线程使用 take 方法 take 走了一个元素后,条件就变成 size < arr.lenngth ,线程 A 就能继续往下执行。(相当于二次确认的效果)。

        但是,不排除在其他代码中,唤醒之后,条件仍然成立的可能性。如果使用了 if ,那么只有一次判断,代码继续往下执行肯定就出错了。(JAVA官方推荐使用while作为 wait 的循环判断条件)

相关文章:

JAVA阻塞队列

目录 一、什么是阻塞队列&#xff1f;特点是什么&#xff1f; 二、阻塞队列的两种创建方式&#xff1a; 1、使用 ArrayBlockingQueue<>( ) : 2、使用 LinkedBlockingQueue<>( ) &#xff1a; 三、阻塞队列方法的使用&#xff1a; 阻塞队列关键的两个方法&…...

tomcat与spring-web

文章目录 SpringServletContainerInitializerWebApplicationInitializerWebApplicationInitializer接口AbstractContextLoaderInitializer抽象类AbstractDispatcherServletInitializer抽象类AbstractAnnotationConfigDispatcherServletInitializer抽象类 WebApplicationContext…...

将电脑控制手机编写为MCP server

文章目录 电脑控制手机后,截屏代码复习MCP server构建修改MCP的config文件测试效果困惑电脑控制手机后,截屏代码复习 def capture_window(hwnd: int, filename: str = None) -> dict:""&...

[ctfshow web入门]burpsuite的下载与使用

下载 吾爱破解网站工具区下载burpsuite https://www.52pojie.cn/thread-1544866-1-1.html 本博客仅转载下载链接&#xff0c;下载后请按照说明进行学习使用 打开 配置 burpsuite配置 burpsuite代理设置添加127.0.0.1:8080 浏览器配置 如果是谷歌浏览器&#xff0c;打开win…...

文章记单词 | 第25篇(六级)

一&#xff0c;单词释义 mathematical&#xff1a;形容词&#xff0c;意为 “数学的&#xff1b;数学上的&#xff1b;运算能力强的&#xff1b;关于数学的”trigger&#xff1a;名词&#xff0c;意为 “&#xff08;枪的&#xff09;扳机&#xff1b;&#xff08;炸弹的&…...

讯飞语音合成(流式版)语音专业版高质量的分析

一、引言 在现代的 Web 应用开发中&#xff0c;语音合成技术为用户提供了更加便捷和人性化的交互体验。讯飞语音合成&#xff08;流式版&#xff09;以其高效、稳定的性能&#xff0c;成为了众多开发者的首选。本文将详细介绍在 Home.vue 文件中实现讯飞语音合成&#xff08;流…...

【MediaPlayer】基于libvlc+awtk的媒体播放器

基于libvlcawtk的媒体播放器 libvlc下载地址 awtk下载地址 代码实现libvlc相关逻辑接口UI媒体接口实例化媒体播放器注意事项 libvlc 下载地址 可以到https://download.videolan.org/pub/videolan/vlc/去下载一个vlc版本&#xff0c;下载后其实是vlc的windows客户端&#xff0…...

复古未来主义屏幕辉光像素化显示器反乌托邦效果PS(PSD)设计模板样机 Analog Retro-Futuristic Monitor Effect

这款模拟复古未来主义显示器效果直接取材于 90 年代赛博朋克电影中的黑客巢穴&#xff0c;将粗糙的屏幕辉光和像素化的魅力强势回归。它精准地模仿了老式阴极射线管显示器&#xff0c;能将任何图像变成故障频出的监控画面或高风险的指挥中心用户界面。和……在一起 2 个完全可编…...

Kafka 如何保证消息有序性?

Kafka 保证消息顺序性&#xff0c;是基于 Partition&#xff08;分区&#xff09;级别的顺序 来实现的。下面我们详细拆解一下&#xff1a; ✅ 同一个 Partition 内&#xff0c;消息是严格有序的 Kafka 在 同一个分区&#xff08;Partition&#xff09;内&#xff0c;消息是按…...

【积木画】——第十三届蓝桥杯(2022)T7思路解析

题目描述 关键词 递推、dp 思路 显然这是一道递推题。 但是为什么我还要写在这呢&#xff1f;因为我虽然看了题解但是还是没想明白&#xff0c;综合了下面两篇 参考文献我才初步理解这题的精髓。所以还是自己写一遍为好。 我们把最终结果记为F(n)。 情况1 直接以一个竖着…...

Android studio xml布局预览中 Automotive和Autotive Distant Display的区别

在 Android Studio 中&#xff0c;Configure Hardware Profile 设置中的 Device Type 选项有两个不同的设置&#xff1a;Android Automotive 和 Android Automotive Distant Display&#xff0c;它们的含义和用途如下&#xff1a; 1. Android Automotive 含义&#xff1a;这个…...

第十三章:持久化存储_《凤凰架构:构建可靠的大型分布式系统》

第十三章 持久化存储 一、Kubernetes存储设计核心概念 &#xff08;1&#xff09;存储抽象模型 PersistentVolume (PV)&#xff1a;集群级别的存储资源抽象&#xff08;如NFS卷/云存储盘&#xff09;PersistentVolumeClaim (PVC)&#xff1a;用户对存储资源的声明请求&#…...

Nginx 基础使用(2025)

一、Nginx目录结构 [rootlocalhost ~]# tree /usr/local/nginx /usr/local/nginx ├── client_body_temp # POST 大文件暂存目录 ├── conf # Nginx所有配置文件的目录 │ ├── fastcgi.conf # fastcgi相…...

Docker基础1

本篇文章我将从系统的知识体系讲解docker的由来和在linux中的安装下载 随后的文章会介绍下载镜像、启动新容器、登录新容器 如需转载&#xff0c;标记出处 docker的出现就是为了节省资本和服务器资源 当企业需要一个新的应用程序时&#xff0c;需要为它买台全新的服务器。这样…...

【奇点时刻】GPT4o新图像生成模型底层原理深度洞察报告

个人最近一直在关注openai的新图像生成特性&#xff0c;以下内容基于现阶段社区及研究者们对 GPT-4O 图像生成功能的公开测试、逆向分析与技术推测综合而成&#xff0c;OpenAI 并未正式发布完整的技术报告&#xff0c;因此本文为非官方推断总结。但从多方信息与技术背景出发&am…...

Java的Selenium的特殊元素操作与定位之模态框

Modal Dialogue Box&#xff0c;又叫做模式对话框&#xff0c;是指在用户想要对对话框以外的应用程序进行操作时&#xff0c;必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。 alert&#xff08;警告&#xff09; //访问本地的HTML文件 chromeDr…...

回归预测 | Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测

回归预测 | Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测 目录 回归预测 | Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【JCR一区级】Matlab实现NRBO-Transformer-LSTM多输入单输出回归预测&#xf…...

Python菜鸟教程(小程序)

目录 一.简易计算器 二.学生成绩分级 三.密码设置 四.作业选择 点赞收藏,评论支持 一.简易计算器 print(-------使用的运算符-------\n) print(1.加号) print(2.减号) print(3.乘号) print(4.除号) Aint(input(请输入第一个数: )) Bint(input(请输入第二个数: )) Fi…...

类的(多态性、虚函数)基础练习

练习1&#xff1a;&#xff08;简单&#xff09; #include <iostream> using namespace std; class Vehicle { public: virtual void run() const0; }; class Car: public Vehicle { public: void run() const { cout << "run a car. "<<…...

特殊的质数肋骨--dfs+isp

1.dfs全排列组数&#xff0c;an记得还原 2.如果范围确定且只比较质数&#xff0c;isp比线性筛快&#xff0c;主要这个范围太大了 https://www.luogu.com.cn/problem/P1218 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typed…...

智能体开发实战指南:提示词设计、开发框架与工作流详解

在大语言模型&#xff08;LLM&#xff09;驱动的智能体&#xff08;Agent&#xff09;快速发展的今天&#xff0c;构建一个实用、智能的Agent已不再遥不可及。无论你是开发法律助手、租房合同分析器&#xff0c;还是通用办公自动化助手&#xff0c;理解提示词工程&#xff08;P…...

jetson orin nano学习(torch+OpenCV+yolov5+)

一&#xff1a;入门第一件事&#xff1a;跟着商家教程配置哈哈 指令&#xff1a;nvidia-smi -h 帮助命令 sudo jtop --查看nvidia的gpu状态 Tip:教程下载的pytorth,cuda,cudnn版本不一定是你项目符合的&#xff0c;要提前想好 1.2 安装虚拟环境包&#xff08;要安…...

client-go如何监听自定义资源

如何使用 client-go 监听自定义资源 在 Kubernetes 中使用 client-go 监听自定义资源&#xff08;Custom Resource&#xff0c;简称 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因为 client-go 的标准 Clientset 只支持内置资源&#xff08;如 Pod…...

【51单片机】3-3【定时器/计数器/中断】超声波测距模块测距

1.硬件 51最小系统超声波测距模块 2.软件 #include "reg52.h"//距离小于10cm,D5亮&#xff0c;D6灭&#xff0c;反之相反现象sbit D5 P3^7;//根据原理图&#xff08;电路图&#xff09;&#xff0c;设备变量led1指向P3组IO口的第7口 sbit D6 P3^6;//根据原理图&…...

C语言求3到100之间的素数

一、代码展示 二、运行结果 三、感悟思考 注意: 这个题思路他是一个试除法的一个思路 先进入一个for循环 遍历3到100之间的数字 第二个for循环则是 判断他不是素数 那么就直接退出 这里用break 是素数就打印出来 在第一个for循环内 第二个for循环外...

金仓数据库KCM认证考试介绍【2025年4月更新】

KCM&#xff08;金仓认证大师&#xff09;认证是金仓KES数据库的顶级认证&#xff0c;学员需通过前置KCA、KCP认证才能考KCM认证。 KCM培训考试一般1-2个月一次&#xff0c;KCM报名费原价为1.8万&#xff0c;当前优惠价格是1万&#xff08;趋势是&#xff1a;费用越来越高&…...

leetcode每日一题:替换子串得到平衡字符串

引言 今天的每日一题原题是1863. 找出所有子集的异或总和再求和&#xff0c;比较水&#xff0c;直接对于集合中的每一个元素&#xff0c;都有取或者不取2种情况&#xff0c;直接递归进去求和即可。更换成前几天遇到的更有意思的一题来写这个每日一题。 题目 有一个只含有 Q,…...

2025年数字化社会与智能计算国际学术会议 (ICDSIC 2025)

基本信息 官网&#xff1a;www.icdsic.net 时间&#xff1a;2025年4月18-20日 地点&#xff1a;中国-深圳 主题 数字化社会 智能计算 数字化制造、经济 数字化政务、转型 数字化农业、水利、管理 数字化医疗、学习、社区 数字基建、通信、交通 数字…...

BN测试和训练时有什么不同, 在测试时怎么使用?

我们来彻底搞懂 Batch Normalization&#xff08;BN&#xff09; 在训练和测试阶段的区别&#xff0c;以及 测试时怎么用。 &#x1f9e0; 一句话总结&#xff1a; 训练时&#xff1a;使用 当前 mini-batch 的均值和方差 测试时&#xff1a;使用 整个训练集估计的“滑动平均均值…...

为什么卷积神经网络适用于图像和视频?

我们常听说“卷积神经网络&#xff08;CNN&#xff09;擅长图像和视频”&#xff0c;但其实 CNN 的核心本质远不止图像领域。我们先搞懂它为啥适合图像/视频。 &#x1f9e0;CNN 为什么适用于图像和视频&#xff1f; 主要因为 图像/视频具有空间局部性和结构平移性&#xff0c…...

python爬虫:DrissionPage实战教程

如果本文章看不懂可以看看上一篇文章&#xff0c;加强自己的基础&#xff1a;爬虫自动化工具&#xff1a;DrissionPage-CSDN博客 案例解析&#xff1a; 前提&#xff1a;我们以ChromiumPage为主&#xff0c;写代码工具使用Pycharm&#xff08;python环境3.9-3.10&#xff09; …...

【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!

大家好&#xff0c;我是唐叔&#xff01;上期我们聊了 BeautifulSoup的基础用法 &#xff0c;今天带来进阶篇。我将分享爬虫老司机总结的BeautifulSoup高阶技巧&#xff0c;以及那些官方文档里不会告诉你的实战经验&#xff01; 文章目录 一、BeautifulSoup性能优化技巧1. 解析…...

【动手学深度学习】卷积神经网络(CNN)入门

【动手学深度学习】卷积神经网络&#xff08;CNN&#xff09;入门 1&#xff0c;卷积神经网络简介2&#xff0c;卷积层2.1&#xff0c;互相关运算原理2.2&#xff0c;互相关运算实现2.3&#xff0c;实现卷积层 3&#xff0c;卷积层的简单应用&#xff1a;边缘检测3.1&#xff0…...

IPSG 功能协议

IPSG&#xff08;IP Source Guard&#xff09;即 IP 源保护&#xff0c;是一种基于 IP 地址和 MAC 地址绑定的安全功能&#xff0c;用于防止 IP 地址欺骗和非法的 IP 地址访问。以下是配置 IPSG 功能的一般步骤&#xff1a; 基于端口的 IPSG 配置 进入接口配置模式&#xff1…...

19.go日志包log

核心功能与接口 基础日志输出 Print 系列&#xff1a;支持 Print()、Println()、Printf()&#xff0c;输出日志不中断程序。 log.Print("常规日志") // 输出: 2025/03/18 14:47:13 常规日志 log.Printf("格式化: %s", "数据") Fatal…...

横扫SQL面试——TopN问题

横扫SQL面试 电商平台的"销量Top10商品"&#x1f6cd;️&#xff0c;内容社区的"热度Top5文章“”&#x1f525;&#xff0c;还是金融领域的"交易额Top3客户"&#x1f4b0;——TopN问题无处不在&#xff01; 无论是日常业务分析&#x1f4ca;&#x…...

高级:微服务架构面试题全攻略

一、引言 在现代软件开发中&#xff0c;微服务架构被广泛应用于构建复杂、可扩展的应用程序。面试官通过相关问题&#xff0c;考察候选人对微服务架构的理解、拆分原则的掌握、服务治理的能力以及API网关的运用等。本文将深入剖析微服务架构相关的面试题&#xff0c;结合实际开…...

使用MATIO库读取Matlab数据文件中的cell结构数据

使用MATIO库读取Matlab数据文件中的cell结构数据 MATIO是一个用于读写Matlab数据文件(.mat)的C/C库。下面我将展示如何使用MATIO库来读取Matlab文件中的cell结构数据。 示例程序 #include <stdio.h> #include <stdlib.h> #include <matio.h>int main(int …...

pyTorch框架使用CNN进行手写数字识别

目录 1.导包 2.torchvision数据处理的方法 3.下载加载手写数字的训练数据集 4.下载加载手写数字的测试数据集 5. 将训练数据与测试数据 转换成dataloader 6.转成迭代器取数据 7.创建模型 8. 把model拷到GPU上面去 9. 定义损失函数 10. 定义优化器 11. 定义训练…...

新能源汽车电子电气架构设计中的功能安全

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

使用binance-connector库获取Binance全市场的币种价格,然后选择一个币种进行下单

一个完整的示例,展示如何使用 api 获取Binance全市场的币种价格,然后选择一个最便宜的币种进行下单操作 代码经过修改,亲测可用,目前只可用于现货,合约的待开发 获取市场价格:使用client.ticker_price()获取所有交易对的当前价格 账户检查:获取账户余额,确保有足够的资…...

HikariCP 源码核心设计解析与 ZKmall开源商城场景调优实践

HikariCP 作为 Spring Boot 默认数据库连接池&#xff0c;其高性能源于独特的无锁设计、轻量级数据结构和精细化生命周期管理。以下从源码解析与 ZKmall开源商城性能调优两个维度展开&#xff1a; 一、HikariCP 源码核心设计解析 ​无锁并发控制与 ConcurrentBag 容器 ​Concur…...

P1036 [NOIP 2002 普及组] 选数(DFS)

题目描述 已知 n 个整数 x1​,x2​,⋯,xn​&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4 个整数分别为 3,7,12,19 时&#xff0c;可得全部的组合与它…...

自然语言处理

自然语言处理基础 什么是自然语言处理&#xff1a;让计算机来理解人类所说的一种语言。自然语言处理实际就是让计算机理解人类说的话&#xff0c;然后像人一样进行交互&#xff0c;去进行对话&#xff0c;去生成自然语言。 自然语言处理的基本任务 词性标注&#xff1a;把给…...

LeetCode刷题常见的Java排序

1. 字符串排序(字母排序) 首先,你的代码实现了根据字母表顺序对字符串中的字母进行排序,忽略了大小写并且保留了非字母字符的位置。关键点是: 提取和排序字母:通过 Character.isLetter() 判断是否为字母,并利用 Character.toLowerCase() 来忽略大小写进行排序。保留非字…...

# 利用OpenCV和Dlib实现疲劳检测:守护安全与专注

利用OpenCV和Dlib实现疲劳检测&#xff1a;守护安全与专注 在当今快节奏的生活中&#xff0c;疲劳和注意力不集中是许多人面临的常见问题&#xff0c;尤其是在驾驶、学习等需要高度集中精力的场景中。疲劳不仅影响个人的健康和安全&#xff0c;还可能导致严重的事故。为了应对…...

python基础-16-处理csv文件和json数据

文章目录 【README】【16】处理csv文件和json数据【16.1】csv模块【16.1.1】reader对象【16.1.2】在for循环中&#xff0c; 从reader对象读取数据【16.1.3】writer对象【16.1.5】DictReader与DictWriter对象 【16.4】json模块【16.4.1】使用loads()函数读取json字符串并转为jso…...

Mysql 数据库编程技术01

一、数据库基础 1.1 认识数据库 为什么学习数据库 瞬时数据&#xff1a;比如内存中的数据&#xff0c;是不能永久保存的。持久化数据&#xff1a;比如持久化至数据库中或者文档中&#xff0c;能够长久保存。 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长…...

基于SSM的车辆管理系统的设计与实现(代码+数据库+LW)

摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前企业对于车辆信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式已然落后。本人结…...

BugKu Simple_SSTI_2

这个题很简单&#xff0c;主要是记录一下&#xff0c;做题的原理&#xff1a; 打开环境&#xff0c;提示我们用flag传参&#xff0c;然后我们需要判断是什么模板&#xff1a; 这里有一张图片&#xff0c;可以帮助我们轻松判断是什么模板类型&#xff1a;这个图片找不到出处了&…...