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

wait 和 notify

目录

wait() 方法

notify() 方法

notifyAll() 方法

nofity 和 notifyAll

wait 和 notify

wait 和 sleep 的区别

wait 和 join 的区别


由于线程之间是抢占式执行的,因此,线程之间执行的先后顺序难以预知,但是,在实际开发中,有时候我们希望合理的协调多个线程之间的执行先后顺序

例如:

在篮球场上,每个队员都是独立的 执行流,也就是一个 线程

当需要完成一个具体的得分动作时,就需要多个队员相互配合,按照一定的顺序执行一定的动作,线程 1 先向 线程 2 "传球",线程2 才能 "扣篮"

要完成 协调工作,主要涉及到三个方法:

wait()/wait(long timeout):让当前线程进入等待状态

notify():唤醒当前对象上等待的线程

notifyAll():唤醒当前对象上所有等待的线程

接下来,我们就来学习这三个方法,我们首先来看 wait 方法 

wait() 方法

我们先来看一个例子:

一个柜子里有食物,5个人(线程)共同使用这个柜子,并从里面拿取食物(假设同一时间只能一人拿取),1号先使用这个柜子(对其进行加锁),但是当1号打开这个柜子时发现柜子里没有食物,此时1号就会关上柜门(释放锁),等有食物时再来拿

此时,其他人就会竞争这个锁,争取使用柜子,而刚刚释放锁的1号,也会参与到锁竞争中,因此,也就有可能刚刚释放锁的1号又重新拿到锁,并且,由于1号离得近(1号线程处于 RUNNABEL 状态,其他线程处于 BLOCKED 状态),他就有很大可能再次拿到锁

1号又拿到锁,发现没有食物,又释放锁,又竞争到锁,发现没有食物,又释放锁......

如此重复,就会导致1号反复获取到锁,但是又不能完成实质性的操作;而其他线程,则无法拿到锁。这种情况,称之为 线程饿死(线程饥饿)

线程饿死这样的情况,属于概率性事件(1号拿到锁的概率更大,但是其他线程也有可能会拿到锁),不像 死锁,一旦出现后,就一定会阻塞,但 线程饥饿 这样的情况,也极大可能会影响其他线程的运行

因此,我们就需要对这种情况进行处理:

线程饿死出现的关键在于:1号发现自己要执行逻辑的前提条件不具备(柜子中没有食物)时,就应该主动放弃对锁的竞争,主动放弃去 CPU 上调度执行,即,进入阻塞状态,一直等待前提条件具备了(其他线程往柜子中放了食物),此时再解除阻塞,参与到锁竞争中

此时,就可以使用 wait 进行等待:

让 1号 判断前提条件是否满足,若不满足,则 wait 等待

其他线程让条件满足后,再通过 notify 来唤醒 1号

接下来,我们就通过具体的代码来学习 wait 的使用:

 我们让 t1 线程进入等待:

public class ThreadDemo18 {public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(() -> {System.out.println("t1 进入等待之前");// 进入等待try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}});t1.start();}
}

此时,观察运行结果,发现抛出了异常 IllegalMonitorStateException

为什么会抛出异常呢?

 这是因为 wait 必须搭配 synchronized 来使用

wait 做的事情有:

1. 使当前执行代码的线程进行等待(将线程放到等待队列中)

2. 释放当前锁

3. 满足一定条件时被唤醒,重新尝试获取到这个锁

wait 要对当前锁进行释放,释放锁的前提,是要先拿到锁,因此 wait 必须放到 synchronized 中使用

public class ThreadDemo18 {public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(() -> {System.out.println("t1 进入等待之前");synchronized (locker) {// 进入等待try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();}
}

wait、sleep 和 join,都有可能被 interrupt 提前唤醒,都需要处理异常 

每个对象里都有一把锁,调用 wait 的对象,必须和 synchronized 中的锁对象是一致的,wait 解除的锁是 locker对象 的锁,后续 wait 被唤醒后,重新获取到锁,当然也是获取到 locker 对象的锁 

此时,t1 线程就在 wait 这里阻塞了:

我们使用 jconsole 来观察 t1 线程的状态:

此时,线程进入 WAITING 状态 

而 wait 结束等待的条件为:

1. 其他线程调用该对象的 notify 方法

2. wait 等待时间超时(wait 方法提供了带有 timeout 参数的版本,用来指定等待最长时间)

3. 其他线程调用该等待线程的 interrupt 方法,导致 wait 抛出 InterruptedException 异常

接下来,我们就来学习 notify() 方法,来唤醒等待中的线程

 

notify() 方法

notify() 方法用于唤醒等待的线程

我们在 t2 线程中唤醒 t1 线程:

public class ThreadDemo18 {public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(() -> {System.out.println("t1 进入等待之前");synchronized (locker) {// 进入等待try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}});Thread t2 = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}locker.notify();});t1.start();t2.start();}
}

此时抛出异常 IllegalMonitorStateException

 

这是因为 Java 中约定 notify 也需要放到 synchronized 中

public class ThreadDemo18 {public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(() -> {System.out.println("t1 进入等待之前");synchronized (locker) {// 进入等待try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("t1 结束等待");});Thread t2 = new Thread(() -> {try {Thread.sleep(1000);synchronized (locker) {System.out.println("t2 notify 之前");locker.notify();System.out.println("t2 notify 之后");}} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();}
}

 

在上述代码中:

t1 执行起来后就会立即尝试获取锁,拿到锁后,就立即打印 "t1 进入等待之前",并进入 wait 方法(释放锁且阻塞等待)

t2 执行起来后,会先 sleep(1000)(保证 t1 能够先拿到锁)

t2 sleep 之后,t1 处于 WAINTING 状态,且锁是释放了的,此时,t2 就会立即拿到锁

t2 打印 "t2 notify 之前",执行 notify,唤醒 t1(此时 t1 就从 WAITING 状态恢复回来)

但是由于 t2 还未释放锁,t1 WAITING 状态恢复后,会尝试获取锁,此时会处于阻塞 BLOCKED 状态(由于锁竞争引起的)

t2 执行完 "t2 notify 之后",就会释放锁,且 t2 执行完毕

此时 t1 的wait 就能够获取到锁,并继续执行,打印 "t1 结束等待"

由于,我们也可以知道:当前线程在执行 notify() 方法后,并不会立刻释放锁,而是等 synchronized 代码块执行完后,才会释放锁

如果有多个线程等待,则由线程调度器随机挑选一个处于 wait 状态的线程

 

notifyAll() 方法

notify() 方法只能唤醒其中一个等待的线程,而使用 notifyAll() 方法可以一次唤醒所有等待线程

public class ThreadDemo18 {public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(() -> {System.out.println("t1 进入等待之前");synchronized (locker) {// 进入等待try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("t1 结束等待");});Thread t2 = new Thread(() -> {try {Thread.sleep(1000);synchronized (locker) {System.out.println("t2 notify 之前");locker.notifyAll();System.out.println("t2 notify 之后");}} catch (InterruptedException e) {e.printStackTrace();}});Thread t3 = new Thread(() -> {System.out.println("t3 进入等待之前");synchronized (locker) {// 进入等待try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("t3 结束等待");});t1.start();t2.start();t3.start();}
}

我们可以看到,notifyAll() 同时唤醒了 t1 和 t3 线程,但是,虽然同时唤醒了 2 个线程,但是这 2 个线程需要竞争锁,因此,并不是同时执行的,而是有先后顺序的执行

 

nofity 和 notifyAll

notify() 只会唤醒等待队列中的一个线程(由线程调度器随机挑选一个处于 wait 状态的线程),其他线程仍处于 wait 状态

notifyAll() 则会将等待队列中的线程全都唤醒,此时,这些线程需要重新竞争锁,谁先拿到锁,谁后拿到锁,也是不确定的

 

wait 和 notify

wait 和 notify/notifyAll 彼此之间是通过 object 对象联系起来的

若:

locker1.wait()

locker2.notify()

此时,是无法唤醒使用 locker1.wait() 的线程的,必须两个对象一致才能唤醒,调用 notify 使用的是哪个对象,就会唤醒哪个对象

 

wait 和 sleep 的区别

wait 和 sleep 都能够让线程放弃执行一段时间,但,wait 是用于线程之间的通信,而 sleep 则是让线程阻塞一段时间

wait  和 sleep 都可以被提前唤醒,wait 通过 notify 唤醒,sleep 通过 interrupt 唤醒,但是

使用 wait 时,一般都是在不确定要等多少时间的前提下使用的(超时时间是用来 "兜底" 的,防止出现 死等)

而使用 sleep 是需要知道需要等多少时间的前提下使用的,虽然能够提前唤醒,但通过异常进行唤醒,此时,大概率说明程序出现了一些特殊情况

此外,

wait() 需要搭配 synchronized 使用,但 sleep() 不需要

wait() 是 Object 提供的方法,sleep() 是 Thread 提供的静态方法

 

wait 和 join 的区别

同样的,wait 和 join 都能让线程放弃执行一段时间,等待其他线程先执行,但是,wait 是等到 notify 唤醒后,解除 wait 状态,然后参与到锁竞争中;而 join 需要等到其他线程执行完,才会继续执行

当一个线程调用 wait 方法时,会同步释放锁,然后该线程进入等待 状态,其他线程会竞争这把锁,得到锁的线程继续执行

而一个线程运行过程中调用 另一个线程的 join 方法时,当前线程就会停止执行,一直等到另一个线程执行完毕,才会继续执行

wait() 需要搭配 synchronized 使用,但 join() 不需要

wait() 是 Object 提供的方法,join() 是 Thread 提供的方法

相关文章:

wait 和 notify

目录 wait() 方法 notify() 方法 notifyAll() 方法 nofity 和 notifyAll wait 和 notify wait 和 sleep 的区别 wait 和 join 的区别 由于线程之间是抢占式执行的,因此,线程之间执行的先后顺序难以预知,但是,在实际开发中&…...

docker 启动 mongo,redis,nacos.

docker run --name mymongodb -e MONGO_INITDB_ROOT_USERNAMEadmin -e MONGO_INITDB_ROOT_PASSWORDXiaoyusadsad -p 27017:27017 -v /path/to/mongo-data:/data/db -d mongodb/mongodb-community-server:4.4.18-ubuntu2004-v 的目录必须是绝对目录 目录必须 chmod 777 /path/…...

Docker Swarm 搭建

Docker Swarm 搭建 1. 环境介绍 操作系统Centos 7Centos 7Centos 7内核版本Linux 3.10.0-957.el7.x86_64Linux 3.10.0-957.el7.x86_64Linux 3.10.0-957.el7.x86_64主机名称swarm-managerswarm-worker1swarm-worker2IP192.168.1.100192.168.1.200192.168.1.250Docker Domain20…...

浅述TSINGSEE青犀EasyCVR视频汇聚平台与海康安防平台的区别对比

在我们的很多项目中都遇到过用户的咨询:TSINGSEE青犀EasyCVR视频汇聚平台与海康平台的区别在哪里?确实,在安防视频监控领域,EasyCVR视频汇聚平台与海康威视平台是两个备受关注的选择。它们各自具有独特的功能和优势,适…...

设计模式系列:策略模式的设计与实践

一、背景 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 二、结构 策略模式主要包含三个角色&…...

数据挖掘之数据预处理

数据预处理是数据挖掘中的一个关键步骤,它的主要目的是对原始数据进行清洗、转换和格式化,以确保其质量和一致性,从而为后续的数据挖掘任务(如分类、回归、聚类等)提供可靠的数据基础。数据预处理一般包括以下几个主要…...

RocketMQ核心知识点整理,值得收藏!

1. 基本概念 Topic: 消息类别的集合,如订单消息发送到order_topic。标签(Tag): 同一Topic下区分不同消息的标志,实现精细化消息管理。ConsumeGroup: 消息消费组,可订阅多个Topic,一个Topic可被多个消费组订…...

微信小程序骨架屏

骨架屏是常用的一种优化方案,针对于页面还未加载完时给用户的一种反馈方式。如果自己要写骨架屏有点复杂因为页面的元素过多且不稳定,这边直接使用微信开发工具生成骨架屏。也不只有微信开发工具有像常用的抖音开发工具,字节开发工具都有对应…...

Window下node安装以及配置

在 Windows 下安装 Node.js 非常简单,你可以通过官方提供的安装程序或者使用多版本管理工具(如 NVM-Win)来进行安装。下面是两种方法的具体步骤: 1. 安装 Node.js程序 步骤如下: 访问官方网站: 访问 Node…...

校园疫情防控系统--论文pf

TOC springboot432校园疫情防控系统--论文pf 课题的来源 2019年在我国武汉爆发了一场规模非常庞大、传播速度十分迅速、对人体危害及其严重的新冠肺炎疫情。引发此次急性感染性新冠肺炎疫情的冠状病毒传播性较强,其传播主要是通过呼吸道飞沫和密切接触这两个途径…...

在Debian 9上使用Apt安装Java的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 Java 和 JVM(Java 虚拟机)是许多软件的必备组件,包括 Tomcat、Jetty、Glassfish、Cassandra 和…...

人工智能在网络安全中的三大支柱

人工智能 (AI) 席卷了网络安全行业,各种供应商都在努力将 AI 融入其解决方案中。但 AI 与安全之间的关系不仅仅在于实现 AI 功能,还在于攻击者和防御者如何利用该技术改变现代威胁形势。它还涉及如何开发、更新和保护这些 AI 模型。如今,网络…...

rk3568mpp终端学习笔记

RK3568Terminal封装MppGraph 通过脚本取和设置音量/zigsun/bin/linux/bin.debug.Linux.rk3568/get_record_voice_value.sh /zigsun/bin/linux/bin.debug.Linux.rk3568/set_record_voice_value.sh class RK3568Terminal : public IAVLinkManager, p…...

【C++继承】赋值兼容转换作用域派生类的默认成员函数

1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类)。继承呈现了面向对象程序设计的层次结构&#xf…...

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹,简称虹,是气象中的一种光学现象,当太阳光照射到半空中的水滴,光线被折射及反射,在天空上形成拱形的七彩光谱,由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…...

MySQL——单表查询(二)按条件查询(2)带 IN 关键字的查询

IN 关键字用于判断某个字段的值是否在指定集合中,如果字段的值在集合中,则满足条件,该字段所在的记录将被查询出来。其语法格式如下所示: SELECT *|字段名 1,字段名 2,… FROM 表名 WHERE 字段名 [NOT〕IN(元素 1,元素 2,…) 在上…...

【mysql】mysql 用户管理---创建、权限管理等等

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

本地服务器物理机中redis设置、取消密码

1.服务器物理机上redis的操作【服务器中操作】 (1)首先先看一下当前运行中的redis实例: [rootiZuf67k70ucx14s6zcv54dZ var]# ps aux | grep redis-server因为我这里有两个实例在运行,即物理机上的redis和docker中的redis&…...

关于xilinx的FFTIP的使用和仿真

工具:vivado2018.3,modelsim10.6d 场景:在进行数据进行频谱分析的时候,使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生,通过IP产生的波形数据…...

ant design pro 如何去保存颜色

上图 就是实现这样的效果 后端是这样的,这个颜色肯定是存到字符串里的 这是第一步 import mongoose, { Schema, Document } from mongoose;interface IDiscountCard extends Document {title: string;subtitle: string;image: string;shopUrl: string;bgColor: s…...

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用,辅助学者理解每个组件的定位和用途,从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…...

C++:命名空间与输入输出

目录 前言 一、命名空间 1.1 namespace的价值 1.2 namespace的定义 1.3 命名空间的使用 二、C输入&输出 前言 C是一种面向对象的计算机程序设计语言,‌它扩展了C语言的功能,‌并引入了面向对象编程的概念,‌如类、‌继承和多态等&a…...

Azure DevOps Server 数据库日志已满,TF30042: The database is full

Contents 1. 问题描述2. 处理方式 2.1 系统备份2.2 收缩日志2.3 恢复模式2.4 日志增长无法控制 1. 问题描述 Azure DevOps Server 作为微软的软件开发管理平台产品,理所当然地使用了微软的数据库软件SQL Server。 在一个大型的开发团队中,Azure DevOps S…...

[C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换

//转为 bitmap方法一: Bitmap map OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); process_pictureBox.Image map; //转为 bitmap方法二: Bitmap map new Bitmap(mat.ToMemoryStream()); process_pictureBox.Image map; //Image img 转为…...

【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例

传统供应链金融存在着信息不对称、信任问题和繁琐流程等弊端。为了解决这些问题,京北方搭建了基于区块链 的供应链金融系统,提供了更高效、透明、安全和可信的交易环境。 系 统 采 用 FISCO BCOS 为 底 层 链, 技 术 栈 使 用 Java 语 言 进…...

AI语言大模型商业价值深度解析

点击蓝字 关注我 随着人工智能(AI)技术的飞速发展,特别是深度学习算法的进步,AI语言大模型在自然语言处理领域的表现日益突出。国内外多种语言大模型如:OpenAi 的 ChatGpt,阿里通义千问,百度文心…...

理解DDD领域驱动设计思想

一、引言 在软件开发的广袤领域中,领域驱动设计(Domain-Driven Design,简称 DDD)犹如一颗璀璨的明星,备受瞩目。对于期望运用 DDD 开展项目的研发人员而言,明晰 DDD 的本质是实现其有效应用的基石。需注意…...

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作,那么恭喜你,你已经踏上了一段充满魔法与惊喜的旅程!不过,别忘了,视频的灵魂不仅仅在于画面,更在于那直击心灵的音效。 想象一下,一个精心剪辑的片段,…...

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标,推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway,grafana上配大盘 golang-sdk 项目地址 https://git…...

HTTPS 详解

HTTPS 是以安全为目标的 HTTP 通道,它在 HTTP 中加入 SSL 层以提高数据传输的安全性。HTTP 被用于在 Web 浏览器和网站服务器之间传递信息,但以明文形式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务…...

Microsoft Edge 使用方法与秘诀概览

目录 ​编辑引言 Microsoft Edge 功能与技巧概览 掌握这些设置技巧,让 Edge 浏览器的体验更干净 1. 使用阅读视图 2. 开启广告过滤 3. 管理扩展 4. 个性化新标签页 5. 使用网页截图 6. 清理浏览器缓存 7. 管理启动设置 8. 自定义地址栏建议 9. 使用内置笔…...

【视频】onvif、RTP、RTCP、SDP、RTSP、gb21818区别

ONVIF (Open Network Video Interface Forum): ONVIF是一个全球性的开放网络视频接口论坛,致力于发展基于IP网络的物联网设备的标准化。它提供了一个通用的标准接口,使不同厂商生产的网络视频产品能够互相兼容。 RTP (Real-time Transport Protocol): R…...

8-4 循环神经网络

对于 (8.4.2)中的函数 f f f,隐变量模型不是近似值。 毕竟 h t h_{t} ht​是可以仅仅存储到目前为止观察到的所有数据, 然而这样的操作可能会使计算和存储的代价都变得昂贵。 回想一下,我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的…...

Linux系统编程 --- 多线程

线程:是进程内的一个执行分支,线程的执行粒度,要比进程要细。 一、线程的概念 1、Linux中线程该如何理解 地址空间就是进程的资源窗口。 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是&#xff1…...

Grafana中的rate与irate以及histogram

用法 rate rate函数用于计算一个时间序列在给定时间范围内的平均速率。它对每个数据点进行线性插值来计算速率,因此对于平滑和稳定的数据来说,rate是一个不错的选择。语法如下: rate(metric_name[time_range])metric_name: 指标名称。time…...

什么是网络安全态势感知

态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力,是以安全大数据为基础,从全局视角提升对安全威胁的发现识别、理解分析、响应处置能力的一种方式、最终是为了决策与行动,是安全能力的落地 态势感知的重要性 随着网络与信息技术的…...

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {...

高效同步与处理:ADTF流服务在自动驾驶数采中的应用

目录 一、ADTF 流服务 1、流服务源&#xff08;Streaming Source&#xff09; 2、流服务汇&#xff08;Streaming Sink&#xff09; 二、数据链路 1、数据管道&#xff08;Data Pipe&#xff09; 2、子流&#xff08;Substreams&#xff09; 3、触发管道&#xff08;Tri…...

【Arduino】ATmega328PB 连接 LSM6DS3 姿态传感器,并读数据(不确定 ESP 系列是否可行,但大概率是可行的)

总览 1.初始化 ATmega328PB&#xff0c;默认大家已经完成了 328 的配置准备工作&#xff0c;已经直接能够向里面写入程序 2.接线&#xff0c;然后验证 mega328 的 I2C 设备接口能否扫描到 LSM6DS3 3.编写代码&#xff0c;上传&#xff0c;查看串口数据。完成。 一、初始化 AT…...

live2d + edge-tts 优雅的实现数字人讲话 ~

震惊&#xff01;live2d数字人竟开口说话 ~ 之前有想做数字人相关项目&#xff0c;查了一些方案。看了一些三方大厂的商用方案&#xff0c;口型有点尴尬&#xff0c;而且很多是采用视频流的方案&#xff0c;对流量的消耗很大。后来了解了live2d 技术&#xff0c;常在博客网页上…...

二进制安装php

下载php二进制包&#xff1a; 官网地址&#xff1a;https://www.php.net/releases/ PHP: Releaseshttps://www.php.net/releases/在里边可以选择自己要下载的包进行下载&#xff1b; 下载完成后进行解压&#xff1a; tar xvzf php-7.3.12.tar.gz 解压后 进入目录进行预编…...

旧版Pycharm支持的python版本记录

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;旧版Pycharm支持的python版本记录-CSDN博客 前言&#xff1a;近期由于打算研究GitHub上一个开源量化交易平台开发框架&#xff0c;但是该框架是基于python3.10的版本开发&#xff0c;所…...

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…...

C++面试基础系列-struct

系列文章目录 文章目录 系列文章目录C面试基础系列-struct1.C中struct2.C中struct2.1.同名函数2.2.typedef定义结构体别名2.3.继承 3.总结3.1.C和C中的Struct区别 4.struct字节对齐5.struct与const 关于作者 C面试基础系列-struct 1.C中struct struct里面只能放数据类型&#…...

代码随想录算法训练营 | 动态规划 part05

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 例子&#xff1a; 背包可容纳重…...

英特尔XPU大模型应用创新

...

仿Muduo库实现高并发服务器——socket网络通信模块

本项目就是基于TCP网络通信搭建的。 TCP: 客户端&#xff1a;socket(),connect(). 服务端&#xff1a;socket(),bind(),listen(),accept(). 下面代码就是对原生API网络套接字的封装。需要熟悉原生API网络套接字接口。 下面这段代码&#xff0c;没什么好讲的&#xff0c;就不…...

模型 神经网络(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。仿脑智能&#xff0c;深度学习&#xff0c;精准识别。 1 神经网络的应用 1.1 鸢尾花分类经典问题 神经网络的一个经典且详细的经典应用是鸢尾花分类问题 。主要是通过构建一个神经网络模型来自动区分…...

事务的使用

1.如何使用事务: 1.1.事务的完成过程&#xff1a; 1.步骤1&#xff1a;开启事务2.步骤2&#xff1a;一系列的DML操作3.步骤3&#xff1a;事务结束状态&#xff1a;提交事务(COMMIT)&#xff0c;中止事务&#xff08;事务回滚ROLLBACK&#xff09; 1.2.事务分类&#xff1a; …...

【免费】企业级大模型应用推荐:星环科技无涯·问知

无涯问知是星环科技发布的大模型应用系统&#xff0c;那么我们先简单了解下星环科技吧&#xff01; 星环科技&#xff08;股票代码&#xff1a;688031&#xff09;致力于打造企业级大数据和人工智能基础软件&#xff0c;围绕数据的集成、存储、治理、建模、分析、挖掘和流通等数…...