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

【Java EE初阶】多线程(二)

1.在图中代码,我们调用了start方法,真正让系统调用api创建了一个新线程,而在这个线程跑起来之后,就会自动执行到run。调用start方法动作本身速度非常快,一旦执行,代码就会立即往下走,不会产生任何的阻塞等待。因此我们看到的输出为:

然而,看到的是hello main在前的情况并不是唯一的,可能会有例外。因为当我们调用start之后,main线程和t5线程,他们两个执行,是一个“并发执行”的关系。而对于线程调度,操作系统具有随机性,所以结果顺序并不是唯一的。

如果执行完start恰好被调度出cpu(概率性时间),此时,cpu下次限制性main还是先执行t5就不确定了。

2.一个线程对象只能start一次。

如上图所示,我调用了两次t5.start();然后就出现了图中所示的错误,错误显示为“非法的线程状态”。原因是设计java的人约定了Thread对象只能start一次,一个Thread对象,只能对应到操作系统中的一个线程。如果需要多个线程,可以多创建几个Thread对象。

在创建线程的时候,start方法对线程状态做了判定,线程,在执行了start方法之后,就是就绪状态/阻塞状态了,对于就绪状态(阻塞状态下)的线程,我们不能够再次start。

3.中断一个线程。

中断:中断,也是操作系统中的一个专用术语。即“打断”、“终止”。意思是正常情况下,一个线程需要把入口方法执行完才能够使线程结束。(如果希望线程在没有执行完的情况下就结束,那么就需要通过“打断线程”的操作,也需要线程本身,代码做出配合)。这种情况一般发生在线程在sleep的过程中。

中断线程的几种方法:

(1)通过变量。

(2)直接就使用线程内置的标志位is interruptted()

Thread对象中,包含了一个boolean变量。如果该变量为false,说明没有人去尝试终止这个线程,如果为true,说明有人尝试终止。

此处会报错的原因:此处针对lambda表达式的定义,其实是在new Thread之前的。因此t1还没有被初始化完成,是没办法进行方法的调用的。

currentTread也是Thread类提供的一个静态方法,哪个线程调用这个方法,就返回哪个线程对象的引用。

通过t.interrupt();我们可以来终止t线程。

线程终止这里,有一个奇怪的设定。如果t线程正在sleep,此时main中调用Interrupt方法,就会把sleep提前唤醒。

这个异常支持sleep提前唤醒,通过异常,区分sleep是睡足了还是提前醒了。

sleep提前唤醒,触发异常之后,sleep就会把isinterrupted标志位重置为false。

于是输出继续打印Hello Thread。

上述奇怪的设定,主要是为了给程序员更多的操作空间。还没睡饱,就唤醒了,可能会存在一些“还没做完”的工作。于是java希望让程序员自行决定线程t是要继续执行,还是立即结束,还是稍等一会儿再结束。

如何结束这种现象?——>在抛出异常之后添加一个break;我们也就跳出循环了。

几种情况的对比:

相当于完全忽视了请求

让线程立即结束。

在break之前去完成其他的事情,添加其他的善后逻辑,就相当于“稍后再结束”。

小结:

上述几种方式,本质上,都是t线程自己决定自己是否要终止,相当于main只是给t提供了一个“提醒”建议,而不是强制执行的。

如果采取强制终止的手段,很可能t线程的某个逻辑没有执行完,可能就会造成一些“脏数据”的输出,e.g.t执行过程中针对数据库的数据进行多次增删改查操作,结果由于上述强制中断,导致对数据库的数据修改操作只进行了一半,留下了脏数据。

使用Interrupt方法的时候,

1.t线程没有进行sleep等阻塞操作,t的isInterrupted()方法返回true,通过循环条件结束t线程。

2.t线程中进行了sleep等阻塞操作,t的isInterrupted()方法还是会返回true,但是sleep如果是被提前唤醒,抛出InterruptException,同时也会把isInterrupted()的返回结果设为false。此时就需要手动决定是否要结束线程了。

二、线程等待

一般情况下,系统是随机调度的(抢占式执行),如我们之前所说的hello main和hello thread哪一个先开始打印问题。当启动两个线程之后,这两个线程的执行顺序不确定。而对于程序员来说,程序员并不喜欢“随机”的东西。有些时候,程序员是希望顺序能够固定下来。

那么就引出了线程等待的概念——线程等待:约定了两个线程结束的先后顺序,让“后结束”的线程阻塞,等待“先结束”的线程执行完

join()方法:t.join()。哪个线程中调用的join,这个线程就是“等的一方”(此处就是main线程)。join前面是哪个引用,对应的线程就是“被等的一方”(此处就是t)。main线程等待t线程结束。从字面上去理解,t要加入到“main”中,加入到main中,前提是main要存在,所以main的存在时间就要比t长。

*Java多线程当中,只要这个方法会产生“阻塞”(就可能被Interrupt提前唤醒),就都会抛出InterruptedException异常。

join等待是“死等”“不见不散”,只要被等待的线程t没有结束,join都会始终阻塞。

main可以等待t,t同样也可以等待main.

是否可以同时让main也等待t,让t也等待main?

代码完全可以这么写,但是这么些是没有意义的。这种情况下就会出现两个线程都无法结束,都无法完成对方的等待操作。

*使用join的前提是,我们需要明确知道当前这里的线程结束顺序。

join在一定情况下不会触发阻塞,例如:main等待t,如果main的join之前,t就已经结束了,此时join就不会阻塞。

join默认的情况是死等,但是join还有一个重载的版本,可以指定“等待的最大时间”(超时时间)。

这次执行大概有12ms的误差

*网络编程中,超时时间非常重要,网络通信中数据传输时丢包是很常见的情况。

计算机在衡量时间的时候,是可能存在误差的,误差范围就是在ms级别。

*实际开发中,优先使用带有超时时间的版本。

哪个线程调用currentThread,就能获取到哪个线程对象的引用。

通过Thread.sleep()控制线程休眠。

Thread.sleep本质就是让线程的状态变成了“阻塞”状态,此过程就不参与cpu的调度了。直到时间到,这个线程的状态再次恢复成就绪状态,才能参与cpu调度(*此处只是恢复“就绪”,而不是立即执行)

三、线程的状态

1.NEW状态

NEW:安排了工作,但还未开始行动。(Thread对象创建了,但是还没开始start。)

2.TERMINATED状态

TERMINATED:工作完成了。(线程执行完了(入口方法结束了),但是Thread对象还在)

3.RUNNABLE:可工作的,又可以分成正在工作中的和即将开始工作的。

就绪状态,随时可拿去cpu上执行。

代码中不触发阻塞类操作,都是RUNNABLE状态。

*操作系统中的线程,生命周期和Thread对象不完全一致。什么是生命周期:什么时候创建,什么时候销毁之间的一段周期。

阻塞状态:

1.BLOCKED:这几个都表示排队等着其他事情 (由于“加锁”产生的阻塞)

2.WAITING:这几个都表示排队等着其他事情(无超时时间的阻塞) join无参数版本

3.TIMED_WAITING:这几个都表示排队等着其他事情(有超时时间的阻塞)join有参数版本,或者是sleep

四、线程安全

某一段代码,在单线程环境下执行是正确的,但是放到多线程环境下去执行,就会产生bug。这就是线程安全问题:

e.g.

package Thread;public class Demo15 {public static int count = 0; // 共享变量,多个线程共同修改的变量,称为共享变量public static void main(String[] args) {Thread t1 = new Thread(() -> { // 线程t1for (int i = 0; i < 5000; i++) { // 循环5000次count++; // 自增操作,相当于count = count + 1}});Thread t2 = new Thread(() -> { // 线程t2for (int i = 0; i < 5000; i++) { // 循环5000次count++; // 自增操作,相当于count = count + 1}});t1.start(); // 启动线程t1t2.start(); // 启动线程t2try { // 等待线程t1和线程t2执行完毕t1.join(); // 等待线程t1执行完毕t2.join(); // 等待线程t2执行完毕} catch (InterruptedException e) { // 捕获异常e.printStackTrace(); // 打印异常信息}System.out.println(count); // 打印count的值,应该是10000,因为每个线程都自增了5000次}}

输出并不是10000(输出与预期不符合,这就是Bug)

t1和t2两个线程,在同时修改count这个变量,并且修改操作不是“原子的”*,这就会产生bug。

count++这样的操作,如果站在cpu指令的角度来说,其实是三个指令(指令就是机器语言,cpu执行的任务的具体细节,cpu会一条一条的读取指令,解析指令,执行指令)对于cpu来说,每个指令都是执行的最基本的单位。由于操作系统调度线程是“随机的”,某个线程执行到任意一个指令的时候,都可能会触发cpu的调度。

count++本质上对应三个指令:

1.load:把内存中的数值,加载到cpu寄存器中

2.add:把寄存器中的数据进行加1操作,结果还是放到寄存器里面

3.save:把寄存器中的值写回到内存中

上述过程在多线程中进行执行的时候,会出现以下几种情况:

最后输出值为2的正确程序:

而其他的情况,最后结果并不正确!!

在整个循环5w次的过程中,也不知道有多少次是“正确”的情况,多少是“错误”的情况(线程调度顺序是随机的)。因此在宏观上,我们看到的最终结果肯定比10w次少,或者等于10w次。

出现错误的结果一定是<10w次,但是整个错误的结果,是否一定是>=5w次呢?——答案是可能的。

相关文章:

【Java EE初阶】多线程(二)

1.在图中代码&#xff0c;我们调用了start方法&#xff0c;真正让系统调用api创建了一个新线程&#xff0c;而在这个线程跑起来之后&#xff0c;就会自动执行到run。调用start方法动作本身速度非常快&#xff0c;一旦执行&#xff0c;代码就会立即往下走&#xff0c;不会产生任…...

分布式链路追踪理论

基本概念 分布式调用链标准-openTracing Span-节点组成跟踪树结构 有一些特定的变量&#xff0c;SpanName SpanId traceId spanParentId Trace&#xff08;追踪&#xff09;&#xff1a;代表一个完整的请求流程&#xff08;如用户下单&#xff09;&#xff0c;由多个Span组成…...

conda和bash主环境的清理

好的&#xff01;要管理和清理 Conda&#xff08;或 Bash&#xff09;安装的包&#xff0c;可以按照以下步骤进行&#xff0c;避免冗余依赖&#xff0c;节省磁盘空间。 &#x1f4cc; 1. 查看已安装的包 先列出当前环境的所有安装包&#xff0c;找出哪些可能需要清理&#xff…...

Linux系统管理与编程14:Shell变量及定制bash登录界面

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1.准备工作 创建用户wu useradd wu passwd wu 修改权限 chmod uw /etc/sudoers 编辑 visudo 在root行下&#xff0c;添加&#xff1a;“wu ALL……” 图14- 1 恢复文件权限并…...

微信小程序开发笔记

一、首先&#xff0c;下载一个微信开发者工具。前端项目就正常创建&#xff0c;由于本人的前端一塌糊涂&#xff0c;就让AI给我生成了一个我想要的前端项目&#xff08;包括后面写功能&#xff09;。 这里开发的时候会用到这个&#xff0c;但是一定注意服务部署到服务器上再本…...

SEO长尾关键词优化核心策略

内容概要 在搜索引擎优化领域&#xff0c;长尾关键词因其精准的流量捕获能力与较低的竞争强度&#xff0c;已成为提升网站自然流量的核心突破口。本文围绕长尾关键词优化的全链路逻辑&#xff0c;系统拆解从需求洞察到落地执行的五大策略模块&#xff0c;涵盖用户搜索意图解析…...

第一节:Linux系统简介

理论知识 Linux的起源与发展&#xff1a;1991 年&#xff0c;芬兰赫尔辛基大学的学生林纳斯托瓦兹受到 Minix 和 Unix 思想的启发&#xff0c;开始编写 Linux 内核。最初&#xff0c;它只是一个个人项目&#xff0c;但随着开源社区的加入&#xff0c;Linux 迅速发展壮大。如今…...

微信聊天机器人搭建 教程/开发

创建标签 简要描述&#xff1a; 添加标签 请求URL&#xff1a; http://域名地址/addContactLabel 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必…...

Ubuntu中C++项目安装二次规划库——qpOASES 库

一、在Ubuntu安装qpOASES 库 步骤 1&#xff1a;更新系统包列表 首先&#xff0c;打开终端&#xff0c;执行以下命令更新系统的包列表&#xff0c;以确保你能获取到最新的软件包信息。 sudo apt update 步骤 2&#xff1a;安装必要的依赖 qpOASES库的编译和安装需要一些基…...

JavaScript-基础语法

前言&#xff1a; 一个网页由三个部分组成&#xff1a; 1.html&#xff1a;超文本标记语言&#xff0c;用于控制网页的结构(页面元素和内容&#xff09; 2.css&#xff1a;级联样式表&#xff0c;用于控制网页布局&#xff0c;涉及对网页文字&#xff0c;背景&#xff0c;布局进…...

已有 npm 项目,如何下载依赖、编译并运行项目

诸神缄默不语-个人技术博文与视频目录 这篇博文的适用场景是比如说反正你现在有了一个现成的npm项目&#xff0c;然后无论如何&#xff0c;你要把前端挂起来。 文章目录 一、准备工作1. 安装 Node.js 和 npm2. 克隆或获取项目代码 二、安装项目依赖三、了解 npm 脚本命令四、构…...

第四章:Messaging and Memory

Chapter 4: Messaging and Memory 从配置管理到消息记忆&#xff1a;如何让AI记住对话内容&#xff1f; 在上一章的配置管理中&#xff0c;我们已经能让系统记住所有参数设置。但你是否想过&#xff1a;如果用户连续提问“今天天气如何&#xff1f;”和“明天呢&#xff1f;”…...

iPhone闹钟无法识别调休致用户迟到,苹果客服称会记录反馈

iPhone闹钟无法识别调休致用户迟到&#xff0c;苹果客服称会记录反馈 基于 6 个来源 因“五一”劳动节调休&#xff0c;4月27日&#xff08;周日&#xff09;本应上班&#xff0c;不少iPhone用户却因闹钟未响迟到&#xff0c;“调休”“当苹果闹钟遇到调休”话题登上热搜。苹…...

npm error code CERT_HAS_EXPIRED

npm error code CERT_HAS_EXPIRED 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.net、C、python开发&#xff0c; 如果遇到技术问题&#xff0c;即可私…...

C++ 之 【list的简介、list 的构造函数、iterator、容量操作、元素访问、增删查改与迭代器失效】

目录 1.list的介绍 2.list的使用 2.1 构造函数 2.2 iterator 的使用 2.3 容量操作 2.4 元素访问 2.5 增删查改 2.5.1头插头删与尾插尾删 2.5.2 insert 、erase 函数 2.5.3 clear、swap函数 2.5.4 关于find函数 3.迭代器失效 1.list的介绍 (1)list的底层通常实现为带…...

使用手机录制rosbag包

文章目录 简介录制工具录制步骤录制设置设置IMU录制频率设置相机分辨率拍照模式录制模式数据制作获取数据数据转为rosbag查看rosbag简介 ROS数据包(rosbag)是ROS系统中用于记录和回放传感器数据的重要工具,通常用于算法调试、系统测试和数据采集。传统上,rosbag依赖于ROS环…...

使用阿里云 CDN 保护网站真实 IP:完整配置指南

使用阿里云 CDN 保护网站真实 IP&#xff1a;完整配置指南 一、宝塔面板准备工作1. 确认网站部署状态2. 宝塔中检查网站配置 二、配置阿里云 CDN1. 添加域名到 CDN2. 配置 DNS 解析3. 配置成功确认 三、宝塔面板安全加固&#xff08;隐藏 IP 的关键步骤&#xff09;1. 禁止通过…...

JAVA-StringBuilder使用方法

JAVA-StringBuilder使用方法 常用方法 append(Object obj) 追加内容到末尾 sb.append(" World"); insert(int offset, Object obj) 在指定位置插入内容 sb.insert(5, “Java”); delete(int start, int end) 删除指定范围的字符 sb.delete(0, 5); replace(int start…...

Milvus(9):字符串字段、数字字段

1 字符串字段 在 Milvus 中&#xff0c;VARCHAR 是用于存储字符串数据的数据类型。定义VARCHAR 字段时&#xff0c;有两个参数是必须的&#xff1a; 将datatype 设置为DataType.VARCHAR 。指定max_length &#xff0c;它定义了VARCHAR 字段可存储的最大字符数。max_length 的有…...

locust压力测试

安装 pip install locust验证是否安装成功 locust -V使用 网上的教程基本上是前几年的&#xff0c;locust已经更新了好几个版本&#xff0c;有点过时了&#xff0c;在此做一个总结 启动 默认是使用浏览器进行设置的 # 使用浏览器 locust -f .\main.py其他参数 Usage: locust […...

Uniapp:showLoading(等待加载)

目录 一、出现场景二、效果展示三、具体使用一、出现场景 在项目的开发中,我们经常会请求后台接口返回数据,但是每一个接口返回数据的时间不一致,有的快,有的慢,这个时候如果不加一个遮罩层,接口返回慢的时候,非常影响用户体验 二、效果展示 三、具体使用 显示加载框…...

线性代数的本质大白话理解

先一句话总结的如下&#xff1a; 线性代数的本质&#xff0c;就是研究“线性变化”——包括空间中点、向量、矩阵之间如何通过线性规则&#xff08;加法、数乘&#xff09;变化和联系&#xff0c;并理解这些变化背后的结构。 1. 向量&#xff08;Vector&#xff09;——不是数据…...

【Rust通用集合类型】Rust向量Vector、String、HashMap原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

Kotlin await等待多个异步任务都完成后才进行下一步操作

Kotlin await等待多个异步任务都完成后才进行下一步操作 import kotlinx.coroutines.*fun main() {runBlocking {val tagA "a"val tagB "b"val a async {worker(tagA)}val b async {worker(tagB)}println("${System.currentTimeMillis()} 等待 $t…...

佛山大旺高新区3650 M5 ERP服务器维修案例

1&#xff1a;机器型号&#xff1a;联想system x3650 m5 2&#xff1a;故障问题&#xff1a;纺织公司由于没有专业的it网管&#xff0c;导致服务器各种爆故障灯&#xff0c;本次处理的是用户反馈最近ERP软件使用过程中经常弹出资源不足的报错。 3&#xff1a;于是预约我们工程…...

利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件

以下是一个 Python 脚本&#xff0c;用于生成 Xilinx IP ROM 的.coe 格式初始化文件&#xff0c;假设ROM 深度为 1024&#xff0c;数据位宽为 32bit&#xff0c;使用随机的 32 位无符号数进行初始化&#xff1a; import random# 定义ROM的深度和数据位宽 rom_depth 1024 data…...

配置电子邮件服务

配置电子邮件服务 一&#xff0e;基于Postfix的邮件发送 1. 安装Postfix yum install postfix -y 再下载一个telnet工具 yum -y install telnet 启动Postfix systemctl start postfix systemctl enable postfix 查看系统中端口是否被Postfix使用 netstat -tnlp | gre…...

WGCAT工单系统发现错误 定时处理工单数据任务错误

一直在用WGCAT工单系统&#xff0c;今天在系统日志里&#xff0c;看到了这个错误提示&#xff0c;不知道是什么原因 2025-04-26 07:05:00.000 [taskScheduler-10] INFO com.wgcloud.task.ScheduledTask - 定时处理工单数据任务开始----------2025-04-26 07:05:00 2025-04-26 …...

软件工程(一):黑盒测试与白盒测试

黑盒测试&#xff08;Black Box Testing&#xff09; 定义 黑盒测试是指不关心程序内部实现细节&#xff0c;只关注输入和输出的测试方法。把被测软件当作一个“黑盒子”&#xff0c;只依据功能说明书或需求文档来编写测试用例&#xff0c;验证功能是否正确。 特点 不需要了…...

emqx部署

要修改文件-命名空间-节点选择器 #apiVersion: v1 ##kind: ConfigMap ##metadata: ## name: emqx-config ##data: ## emqx.conf: | ## # --- apiVersion: v1 kind: PersistentVolume metadata:name: emqx-pv spec:capacity:storage: 5GivolumeMode: FilesystemaccessMode…...

【KWDB 创作者计划】_KWDB产品技术解读

文章目录 每日一句正能量一、KWDB简介二、官网信息三、技术亮点解读&#xff08;一&#xff09;存储引擎&#xff08;二&#xff09;查询引擎&#xff08;三&#xff09;分布式架构 四、应用场景五、总结 每日一句正能量 你的心为什么这样分散&#xff0c;使得你放慢了脚步。他…...

C++ 表达式求值优先级、结合律与求值顺序(五十九)

1. 运算符优先级与结合律 优先级&#xff08;Precedence&#xff09; 决定未加括号时运算符如何“绑”在一起&#xff1a;5 10 * 20 / 2; // 等同于 5 ((10 * 20) / 2)结合律&#xff08;Associativity&#xff09; 决定同级运算符的结合方向&#xff1a; 左结合&#xff0…...

乐理学习笔记(一)---节拍与音符

节拍 衡量音的长度和节奏的基本单位&#xff0c;以强弱关系按照一定的规律循环进行 拍大腿、拍手 类型 上面的这些不同类型节拍的强弱关系中第一个都是强&#xff08;起确定性作用&#xff0c;而不是音量最大&#xff09; 强和弱是决定性的区别&#xff0c;每一个强拍是和弦…...

《系统架构 - Java 企业应用架构中的完整层级划分》

文章目录 Java 企业应用架构中的完整层级划分核心层级&#xff08;基础架构&#xff09;业务逻辑层接口层基础设施层辅助层级特殊架构层级现代架构扩展层各层调用关系示例分层原则建议 Java 企业应用架构中的完整层级划分 除了常见的 Controller、Service、DAO 等标准层级外&a…...

Adobe Lightroom Classic v14.3.0.8 一款专业的数字摄影后期处理软件

软件介绍 Adobe Lightroom Classic 2025中文激活版&#xff08;Adobe桌面照片编辑软件&#xff09;LRC2025&#xff08;LR2025本地离线版&#xff09;是一款桌面照片编辑器和相册管理软件的raw格式编辑软件&#xff0c;支持各种RAW图像相机配置&#xff0c;HDR全景照片&#x…...

SQL 易混易错知识点笔记1(drop,role,%,localhost)

DROP 与 DELETE 的区别 DELETE&#xff1a;删除表中的数据行&#xff0c;属于DML操作&#xff0c;可回滚&#xff0c;可带WHERE条件 DELETE FROM table WHERE condition; -- 删除特定行 DELETE FROM table; -- 删除所有行但保留表结构 DROP&#xff1a;删除整个数据库对象(表、…...

C++23 std::bind_back:一种调用包装器 (P2387R3)

文章目录 引言背景知识旧有的绑定工具C20的std::bind_front std::bind_back的定义和功能定义功能 std::bind_back的使用场景简化回调函数部分应用参数 std::bind_back与其他绑定工具的对比与std::bind的对比与std::bind_front的对比 总结 引言 在C的发展历程中&#xff0c;每一…...

使用多线程快速向Excel中快速插入一万条数据案例

当有大量数据需要存入Excel时&#xff0c;使用传统的单线程完成会有以下这些弊端&#xff1a; 导入速度慢&#xff1a;单线程一次只能处理一个任务&#xff0c;在导入大量数据时&#xff0c;需要逐个将数据写入 Excel。这意味着 CPU 在大部分时间里只能处理一个数据块&#xff…...

RestRequest ,newtonsoft解析

var request new RestRequest(Method.GET); IRestResponse response client.Execute(request); Console.WriteLine(response.Content); //保存token Newtonsoft.Json.Linq.JObject obj3 Newtonsoft.Json.Linq.JObject.Pars…...

vs2022解决 此项目需要MFC库。从visual studio安装程序(单个组件选项卡)为正在使用的任何工具和体系结构安装他们问题

使用visual studio 2022创建MFC 单文档的项目&#xff0c;编译器报错&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 MSB8041 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 osgEarthMFC…...

面试算法高频08-动态规划-03

练习题 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每…...

uniapp做app,使用v-for遍历渲染第二层的时候,打包到手机上渲染不出第二层的数据

1.打包apk要严格注意一点&#xff0c;在data中定义的时候要把第二层定义上&#xff0c; pointspower: [{ jcdbh: 1, cgqbhs:[] }] 不然会出现未定义的情况&#xff0c;直接把二层结构定义上&#xff0c;有利无害 2.渲染…...

Uniapp(vue):生命周期

目录 一、Vue生命周期二、Uniapp中页面的生命周期三、执行顺序比较一、Vue生命周期 setup():是在beforeCreate和created之前运行的,所以可以用setup代替这两个钩子函数。onBeforeMount():已经完成了模板的编译,但是组件还未挂载到DOM上的函数。onMounted():组件挂载到DOM完…...

Git技巧:Git Hook,自动触发,含实战分享

Git技巧&#xff1a;Git Hook&#xff0c;自动触发&#xff0c;含实战分享 最近项目需要1个git合入时触发脚本的功能&#xff0c;使用Git Hook功能实现&#xff0c;总结如下&#xff1a; Git项目在路径&#xff1a;repo\.git\hooks下有很多文件&#xff0c;这些文件就是本地钩…...

DeepSeek创始人梁文峰是个什么样的人?

梁文峰是一位在人工智能领域具有深远影响力的企业家和技术创新者&#xff0c;他的个人经历和成就展现了他作为一位技术天才、创新领袖以及社会责任感强的企业家的多重身份。 从学术背景来看&#xff0c;梁文峰出生于广东湛江吴川&#xff0c;17岁时以高考状元的身份考入浙江大…...

【知识科普】今天聊聊CDN

CDN 技术详解&#xff1a;从原理到配置实践 CDN 技术详解&#xff1a;从原理到配置实践一、CDN 核心定义二、工作原理深度解析1. 请求路由机制2. 缓存分层架构3. 内容更新流程 三、核心功能组件1. 基础设施层2. 软件系统 四、典型配置流程&#xff08;以Cloudflare为例&#xf…...

Axure疑难杂症:利用中继器制作三级下拉菜单(逻辑判断进阶)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:三级下拉菜单 主要内容:条件筛选时的逻辑判断思维,中继器使用 应用场景:复合条件下的下拉列表制作 案例展…...

C语言----操作符详解(万字详解)

目录 1. 操作符的分类 2. 二进制和进制转换 3. 原码 反码 补码 4. 移位操作符 4.1 左移操作符 >> 4.2 右移操作符 >> 5. 位操作符 5.1 按位与 & 5.2 按位或 | 5.3 按位异或 ^ 5.4 按位取反 ~ 练习 整数存储在内存中二进制中1的个数 练习 二进制位…...

docker本地部署ClipCascade,实现跨设备剪贴板同步

1、什么是 ClipCascade &#xff1f; ClipCascade 是一款开源的轻量级工具&#xff0c;可以自动同步您的剪贴板在多个设备之间&#xff0c;无需按键。它确保设备之间无缝的剪贴板共享&#xff0c;并以端对端加密优先保护隐私。无论您是在不同工作站之间切换&#xff0c;还是仅…...

Android Compose vs 传统View系统:全面对比与选型指南

Android Compose vs 传统View系统&#xff1a;全面对比与选型指南 一、引言 随着Android Jetpack Compose的正式发布&#xff0c;Android开发迎来了全新的声明式UI框架。本文将全面对比Compose与传统View系统的差异&#xff0c;帮助开发者做出合理的技术选型。 二、核心架构…...