多线程 --- 多线程编程
在写代码的时候,可以使用多进程进行并发编程(在Java中,不太推荐,很多很多关于进程相关的API,在Java标准库中,都没有提供),也可以使用多线程进行并发编程(系统提供了多线程编程的API,Java标准库,已经将这些API封装了,在代码中可以直接使用)。
目录
创建线程
方法1 继承Thread类
方法2: 实现Runnable接口,重写run方法
方法3. 继承Thread,重写run,但是使用匿名内部类
方法4. 实现Runnable,重写 run,匿名内部类
方法5. 使用 lambda 表达式(常用)
完!
创建线程
方法1 继承Thread类
继承Thread来创建一个线程类
细节补充:
1. 第一行代码: class MyThread extends Thread 中,继承的Thread这个类,好像可以直接使用,并不像Scanner,ArrayList,Random一样需要导包,这是为什么呢?
答:Java标准库中,有一个特殊的包,java.lang包,这个包中包含了Thread类,且这个lang包是Java自动引入的。
2.自己创建的类MyThread中,类前面没有public,这是怎么回事?前面能不能写public?
答:一个 .java文件中,只能有一个public的类。 一个类前面如果没有范围限定符,那就默认是包级作用域,就是只能在当前包中被其他类使用。
3.怎么理解run方法是线程的入口方法?
答:此处的run方法,并不需要程序员来手动的进行调用,该方法会在线程创建好之后,一个合适的时机,被JVM自动的调用执行。就类似于,main方法,是一个java进程的入口方法。一个进程中,至少会有一个线程,这个进程中的第一个线程,也就称为”主线程“。main方法,也就是主线程的入口方法。
补充:这种风格的函数,称之为”回调函数“(callback)
在Java数据结构中,优先级队列PriorityQueue,在使用的时候,必须要给对象实现一个比较的接口,才能进行使用。
回调函数 :作为参数传递给另一个函数,在该函数内部的某个特定时刻被调用执行的函数。其核心特点是函数的调用时机由其他代码控制。run方法的函数的调用时机由其他代码(这里是 JVM)控制。
4.run方法上面的 @Override 是什么意思?
答:方法重写。本质上:是让程序员能够对现有的类,进行扩展。我们要搞一个线程,肯定是要让这个线程执行一些代码的,Thread类本身会带有一个run方法。但很明显,标准库自带的run方法,是不知道我们的具体需求的,业务要求是什么样?必须要手动的进行指定,Override就是针对原有的Thread进行扩展(把一些能够复用的,进行了重用,把需要扩展的,进行扩展)。Thread这个API中,会有很多的属性方法,大部分内容直接复用即可,把需要扩展的内容,进行扩展即可。
那如果没有@Override这个注解,貌似也可以实现方法重写呀。为啥还要写这个注解呢?语法中有很多的机制,是方便让编译器,对我们的代码进行自动检查的。(人是非常不靠谱的!!!机器是较为靠谱的!!!)(就比如fina限定符,限定一个变量不能再被修改,就是方便让编译器为我们进行自动检查的)
5.一般来说,实例化的时候都是方式2。
6.什么是操作系统的”内核“?
答:操作系统中,最核心部分的功能模块(管理硬件,给软件提供稳定的运行环境)
操作系统大致可以分为内核空间(内核态)和用户空间(用户态),平时运行的普通的应用程序,网易云音乐,idea,qq等等,都是运行在用户态的。但是,这些应用程序,有时候,需要针对一些系统提供的硬件资源来进行操作。这些操作,都不是应用程序直接操作的,就是需要调用操作系统提供的API,进一步在内核中完成这样的操作。
为啥还要分出用户态和内核态?
最主要的目的还是稳定。防止某些应用程序把硬件设备或者软件资源给搞坏了。系统封装了一些API,这些API都属于是一些”合法“的操作,不会对硬件设备或者软件资源有破坏,应用程序只能调用这些API来实现对应的功能,从而不至于对系统 / 硬件设备产生太大的危害。假如让应用系统直接操作硬件,在极端条件下,代码出现bug,会把硬件干坏。
(就比如是银行系统,办事窗口里的工作人员,就是正经的经过培训政审的安全人员,不会对银行产生危害,用户要办理各种业务,就需要在办事窗口前,给工作人员说清楚需求,由工作人员代办)
具体解释:每个线程都是一个独立的执行流,每个线程都能够独立的去CPU上调度执行。
如下图代码:
下面的死循环,是在 t 线程中执行的
而这个死循环,是在 main 线程中执行的
以之前的理解,如果一个代码中,出现了两个死循环,则肯定最多只能执行一个,另一个循环就进不去了。但我们把进程运行起来,可以看到,两个循环,都在执行!这两个线程,就是两个独立的执行流,也就解释了我们最开始那句话:每个线程都是一个独立的执行流,每个线程都能够独立的去CPU上调度执行。
在调用start方法,创建线程之后,兵分两路,一路,沿着main方法,继续执行,打印hello main,另一路,进入到线程的run方法,打印hello thread。是相互独立的,互不干扰的。
注意:
当有多个线程的时候,这些线程的执行的先后顺序,是不确定的!!!(这一点,是因为操作系统内核中,有一个”调度器“模块,这个模块的实现方法,是一种类似于”随机调度“的效果)
那随即调度又是什么呢?
1. 一个线程,什么时候调度到CPU上去执行,时机是不确定的。
2. 一个线程,什么时候从 CPU上下来,给别人让位,时机也是不确定的)
也称为”抢占式执行“。
所以,每秒钟到底是先执行 main 还是先执行thread,这是不一定的(随机调度,抢占式执行)
主线程,在调用 strat 方法之后,就立即往下执行打印了,与此同时,内核就要通过刚才 API 构建出线程,并且执行run。由于创建线程本身也有开销(虽然开销比创建进程低,但也不是0).所以,在第一轮打印中,因为创建线程有一定的开销影响,导致hello thread一般情况下 都比hello main略慢一筹。
我们刚刚,只是通过打印的方式,看到了两个执行流,还可以通过一些第三方工具,更直观的来查看多个线程的情况。 --> JDK中,有一个jconsole工具,该工具在JDK的bin文件夹中(该工具,只能列出java的进程,其他不是java的进程,无法进行分析)
注意,我们需要先把进程运行起来,然后再打开工具,找到对应的类名,然后进行链接
进入之后,选择线程
main 对应的就是main方法的主线程
黄色框的,就是我们缩写的代码,创建的 t 线程(这个Thread - 0,1,2...是默认名称 可以改)
剩下的线程,都是JVM自带的线程,这些自带的线程,要完成一些垃圾回收,监控统计各种指标....
点进具体的线程,就可以看到相关的调用栈(线程里当前执行到了那个方法的第几行代码,这个方法是如何如何一层调用过去的...)
这里这个线程的在不断的运行的,点击线程详细情况的这个瞬间,就相当于咔嚓来一个闪照一样,把这一瞬间的状态展示到这里了。
这就是使用 jconsole 来检测线程的方法
再回头看我们的举例代码
我们在循环中加入了sleep方法,来降低这两个死循环的速度(在C语言中,用的是Windows api中提供的Sleep函数,Windows.h),我们此处使用的sleep,是Java中封装后的版本,属于是Thread提供的静态方法。
如果我们不进行 try - catch的话,该方法会编译报错,为什么必须需要抛出异常呢? --> 这个异常,意味着,在sleep(1000)的过程中,可能会被提前唤醒。(换句话说:sleep(1000)的作用是休眠1s,但在这休眠1s中,可能会被其他操作给提前唤醒,也就是没休眠够一秒,就被唤醒了,此处我们就应该在catch块中 提出具体的解决方法,到底应该怎么做)
还有一点需要注意:
为什么在run方法中,解决sleep的异常只能是try - catch方法
但是在main方法中,可以是try - catch方法,也可以是在方法体上throws出异常
为什么呢?
原因很简单,run方法中的sleep,如果加上throws的话,就修改了方法签名了,这样的话是无法构成”重写“的,因为父类的run方法中,并没有throws这个异常,子类重写的时候,也就不能throws异常。
方法2: 实现Runnable接口,重写run方法
1.实现Runnable接口
Runnable可以理解成”可执行的“,通过这个接口,就可以抽象表示出一段可以被其他实例来执行的代码。
2.创建Thread实例,调用Thread的构造方法时,将Runnable对象作为参数传入。
Runnable接口,还需要搭配Thread类,才能真正在系统中创建出线程
3.调用start方法
上面这种写法,其实是把 线程 和 要执行的任务 进行了解耦合了。
方法3. 继承Thread,重写run,但是使用匿名内部类
匿名内部类:是一种内部类,在一个类里面定义的类,其最大的特点是-->没有名字,不能重复使用,用一次之后就找不到了。
解释:
写这个 { } 的意思是:定义一个类,与此同时,这个新的类,继承自Thread。此处的 { } 中,可以定义子类的属性和方法。此处最主要的目的就是重写 run 方法。与此同时,这个代码,还创建了子类的实例。且 t 指向的实例,并非是单纯的Thread,而是 Thread的子类(但并不知道这个子类叫什么,因为是匿名的内部类)
方法4. 实现Runnable,重写 run,匿名内部类
这种方法,在Thread构造方法的参数中,填写了 Runnable 的匿名内部类的实例
方法5. 使用 lambda 表达式(常用)
在lambda表达式中, () 中是形参列表,这里可以带参数,但因为线程的入口不需要参数,所以这里为空,() 的前面,应该还有一个函数名,此处作为匿名函数,就没有名字了。
解释:
在Java中,方法是不能脱离类单独存在的,所以就不得不设置回调函数,从而多套了一层。但与此同时,java 语法也开了一个特殊的口子,就是 lambda 表达式,函数式接口,属于是 lambda 背后的实现,相当于 java 在没破坏原有的规则的基础上,给了一个 lambda 一个合法性的解释。
上述五种方法,都是等价的,可以互相转换的,只不过是第五种 lambda 表达式的方法,更为简洁一些,更加常用一些!
完!
相关文章:
多线程 --- 多线程编程
在写代码的时候,可以使用多进程进行并发编程(在Java中,不太推荐,很多很多关于进程相关的API,在Java标准库中,都没有提供),也可以使用多线程进行并发编程(系统提供了多线程…...
利用新一代雷达传感器增强ADAS系统的检测和计算(TI文档)
摘要 德州仪器 (TI) 的新一代雷达传感器AWR2E44P和AWR2944P推动了TI的ADAS雷达产品系列发展,专注于提 高性能以满足严格的 NCAP(新车评估计划)和 FMVSS(联邦机动车辆安全标准)自动驾驶和安全法规。这些雷 达器件为 AWR…...
前端工程化开篇
前端发展史梳理: 最早的html,css,js是前端三剑客,足以实现所有的前端开发任务,但是呢,一个简单的前端交互效果可能就需要一大堆的代码去实现。 后来呢,有了前端库jQuery,他可以使前…...
Android 问真八字-v2.1.7[看八字APP]
Android 问真八字 链接:https://pan.xunlei.com/s/VOMMuCVQRQrM2vRsHj14SsO0A1?pwdavzw# Android 问真八字-v2.1.7[看八字APP]...
go - grpc入门
前期准备 工具安装及使用 grpc开发 编写proto文件 proto文件是符合Protocol Buffers语言规范的数据交换协议文件,就像以前WebService定义服务时使用的XML文件。现在一般都是用proto3了,这里创建一个名为 hello.proto 的文件,放到项目的pr…...
Linux操作系统配置本地yum源和定时任务
操作系统环境:CentOS 7.2 本地yum源配置 1.挂载镜像 mount /dev/cdrom /mnt/cdrom 2.备份原yum配置 mv /etc/yum.repos.d /etc/yum.repos.d.bak 3.创建本地yum源配置文件 mkdir /etc/yum.repos.d vi /etc/yum.repos.d/CentOS-local.repo 添加内容: #本…...
【活动回顾】StarRocks Singapore Meetup #2 @Shopee
3 月 13 日,StarRocks 社区在新加坡成功举办了第二场 Meetup 活动,主题为“Empowering Customer-Facing Analytics”。本次活动在 Shopee 新加坡办公室举行,吸引了来自 Shopee、Grab 和 Pinterest 的专家讲师以及 50 多位参会者。大家围绕电商…...
优选算法——双指针专题
本章先分享关于优选算法的双指针的思路: 主要是以题目来展示常见使用双指针的思路。 ps: 双指针做法:不要被表面所迷惑,它其实是通过用一个数组的下标来充当指针 数组分两块:是⾮常常⻅的⼀种题型,主要就是根据⼀种…...
深度解析:TOML、XML、YAML及其他配置/数据格式对比
深度解析:TOML、XML、YAML及其他配置/数据格式对比 在软件开发和系统配置中,选择合适的配置或数据格式至关重要。本文将对比 TOML、XML、YAML 等常见格式,梳理它们的核心特性、适用场景及区别,并扩展介绍其他类似格式,…...
冗余技术:堆叠技术+链路聚合
目录 前言 一.堆叠技术概述 二.堆叠技术原理 三.堆叠系统登录 四.堆叠合并/分裂 4.1 堆叠双主检测机制(MAD) 五.链路聚合技术概述 六.链路聚合模式 前言 在硬件加速与数据爆炸时代,堆叠技术通过模块化分层设计,实现资源动…...
存储服务器是指什么
今天小编主要来为大家介绍存储服务器主要是指什么,存储服务器与传统的物理服务器和云服务器是不同的,其是为了特定的目标所设计的,在硬件配置方式上也有着一定的区别,存储空间会根据需求的不同而改变。 存储服务器中一般会配备大容…...
文件上传绕过的小点总结(8)
16.apache解析漏洞条件竞争 class MyUpload{.................. var $cls_arr_ext_accepted array(".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",&q…...
设计模式-结构型模式-外观模式
概述 外观模式 : Facade Pattern : 是一种 结构型设计模式. 它为复杂子系统提供一个简化的统一接口,使得客户端无需直接与子系统的各个组件交互,从而降低系统的耦合性。 核心思想 统一接口:将多个子系统的复杂操作封装到一个“外观类”中&…...
DeepSeek 本地部署指南
文章目录 DeepSeek 本地部署指南一、前言二、部署前的准备工作2.1 硬件要求2.2 软件环境 三、模型下载四、本地部署步骤4.1 检查硬件加速支持4.2 部署模型4.3 优化部署 五、常见问题及解决方法5.1 内存不足5.2 模型下载失败5.3 GPU 无法使用 六、总结 DeepSeek 本地部署指南 一…...
Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站
开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组,开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App,登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…...
python每日十题(12)
根据字典的索引方式可知,d.get( egg ,no this food)索引的是字典第一层,但是第一层只有键food,没有键egg,故索引不出值,输出的是“no this food ”。 外层for循环是将a[0][1,2,3],a[1][4,5,6],a[2][7,8,9]依次赋给变量…...
Podman 学习总结
Podman 概述 什么是 Podman? Podman(Pod Manager)是一个开源的容器管理工具,类似于 Docker,可以用于拉取、运行、管理容器镜像。Podman 采用 无守护进程****(Daemonless) 的架构,使…...
作业14 (2023-05-22_const修饰指针)
第1题/共5题【单选题】 C程序常见的错误分类不包含:( ) A.编译错误 B.链接错误 C.栈溢出 D.运行时错误 回答正确 答案解析: 栈溢出是运行时错误的一种,因此C程序不会将栈溢出错误单独列出来,栈溢出包含在运行时错误中。 因此:选择C 第2题/共5题【单选题】 以下关于…...
Qt 线程和 QObjects
线程和 QObjects QThread 继承于 QObject。 它发出信号来指示线程开始或结束执行,并提供一些插槽。 更有趣的是,QObjects 可以在多个线程中使用,发出信号以调用其他线程中的插槽,并向 "生活 "在其他线程中的对象发布事件…...
cocos creator 笔记-路边花草
版本:3.8.5 实现目标:给3d道路生成路边景观花草 在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。 1.将花草模型分别拖入场景中,制作…...
基于SpringBoot+Vue3实现的宠物领养管理平台功能十六
一、前言介绍: 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高,越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员,人们对于宠物的关爱和照顾也日益增加。然而,传统的宠物领养流程存在诸多不便&a…...
MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN(Modular O…...
数据仓库pinia中,getter和actions有什么区别
将计算逻辑放在 getters 还是 actions 里,取决于具体的使用场景和需求,下面详细分析放在 getters 中的优势以及和 actions 的区别,以说明是否有必要放在 getters 里: 1. getters 的优势 缓存特性 getters 具有类似 Vue 计算属性…...
RoMA: 基于Mamba的遥感基础模型, 已开源, 首次验证mamba的scaling能力
Time: 2025-03-27T15:27:00 github: 链接 HuggingFace: 链接 摘要 近年来,自监督学习在视觉 Transformer(ViT)方面的进展推动了遥感(RS)基础模型的突破。然而,自注意力机制的二次复杂度给可扩展性带来了…...
蓝桥杯(电子类)嵌入式第十一届设计与开发科目模拟试题
一、功能概览 二、分模块实现 1、按键 新建interrupt.h和interrupt.c写中断的代码(写法学习来自定时器-按键单击_哔哩哔哩_bilibili) #ifndef __INTERRUPT_H #define __INTERRUPT_H#include "main.h" #include "stdbool.h"struct…...
CMLINK APN 手动设置
以下是针对 CMLINK 的 APN设置 的详细指南,基于常见配置需求: CMLINK APN 手动设置参数 参数项值说明名称CMLINK (自定义)任意命名(如 CMLINK、CM Internet 等),建议使用ASCII字符,无特殊符号。APNcm.com …...
排序--快排--非递归法
一,引言 快排不管是hoare法还是指针法以及挖坑法,最终都是利用函数递归进行实现的,但是只要是函数递归就会有栈溢出的风险,为此本篇文章讲解快排的非递归法。 二,代码逻辑 首先要了解为什么会使用递归进行调用&…...
02 相机标定相关坐标系
标定相关坐标系 一共四个坐标系 图像像素坐标系: u-v,图像左上角为原点图像物理坐标系: x-y,图像中心为原点...
数学建模:MATLAB卷积神经网络
一、简述 卷积神经网络是一种处理具有网格结构数据的深度学习模型,由输入层、卷积层、池化层、全连接层、输出层组成。 输出层:将图像转换为其对应的由像素值构成的二维矩阵,并存储二维矩阵 卷积层:提取图像的底层特征…...
Android读写权限分析
Android系统使用的是Linux内核,所以Android系统沿用了linux系统的那一套文件读写权限。 目录 1,权限解读1.1,权限分为三种类型:1.2,权限针对的三类对象:1.3,文件和目录的权限区别1.3.1…...
计算机网络基础:量子通信技术在网络中的应用前景
计算机网络基础:量子通信技术在网络中的应用前景 一、前言二、量子通信技术基础2.1 量子通信的基本概念2.2 量子通信的主要原理2.2.1 量子密钥分发(QKD)原理2.2.2 量子隐形传态原理三、量子通信技术的特点3.1 绝对安全性3.2 超高通信速率潜力3.3 抗干扰能力强四、量子通信技…...
【算法学习计划】贪心算法(上)
目录 前言(什么是贪心) leetcode 860.柠檬水找零 leetcode 2208.将数组和减半的最少操作次数 leetcode 179.最大数 leetcode 376.摆动序列 leetcode 300.最长递增子序列 leetcode 334.递增的三元子序列 leetcode 674.最长连续递增序列 leetcode …...
Linux 目录结构(文件系统结构)示例说明
在Linux操作系统中,文件系统的结构是理解系统性能及管理的重要基础。每个目录都有它的特定用途,这使得系统管理更加清晰和高效。本文将带您逐步了解每一个重要目录及其功能。 1. 根目录 / 根目录是Linux文件系统的起点,所有文件和目录均从此…...
Linux下的socket演示程序2
server.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "10.148.4.168" //服…...
TiDB与Doris实操对比:深度剖析数据库选型要点
TiDB与Doris实操对比:深度剖析数据库选型要点 宝子们,在大数据处理的广阔天地里,TiDB和Doris都是备受瞩目的数据库解决方案。它们各自有着独特的优势和适用场景,对于我们开发者来说,深入了解它们的实操特性࿰…...
How to install vmware workstation pro on Linux mint 22
概述 VMware 是一家专注于虚拟化技术和云计算解决方案的全球领先软件公司,成立于1998年,总部位于美国加州。它的核心技术是通过“虚拟化”将一台物理计算机的硬件资源(如CPU、内存、存储等)分割成多个独立的虚拟环境(…...
redis常用部署架构之redis分片集群。
redis 3.x版本后开始支持 作用: 1.提升数据读写速度 2..提升可用性 分片集群就是将业务服务器产生的数据储存在不同的机器上。 redis分片集群的架构 如上图所示,会将数据分散存储到不同的服务器上,相比于之前来说,redis要处…...
vim的一般操作(分屏操作) 和 Makefile 和 gdb
目录 一. vim的基本概念 二. vim基础操作 2.1 插入模式 aio 2.2 [插入模式]切换至[正常模式] Esc 2.3[正常模式]切换至[末行模式] shift ; 2.4 替换模式 Shift R 2.5 视图(可视)模式 (可以快速 删除//注释 或者 增加//注释) ctrl v 三&…...
DeepSeek 为何能在短时间内超过 ChatGPT?—— 技术变革与成本重构的双重胜利
2025 年 1 月 27 日,全球科技圈见证了一个历史性时刻:中国 AI 公司深度求索(DeepSeek)开发的同名应用,首次登顶美国苹果 App Store 免费下载榜,超越了长期霸榜的 ChatGPT。这一突破不仅打破了美国科技公司在…...
Wireshark学习
Wireshark简介 抓包前 1.打开wireshark得到下面的界面 2.选择菜单栏上捕获-> 选项,勾选WLAN网卡(这里需要根据各自电脑网卡使用情况选择,简单的办法可以看使用的IP对应的网卡)。点击开始。启动抓包。 3.wireshark启动后&am…...
我的创作纪念日——三周年
大家好,心心念念的三年之气已到,但是我似乎对于博客专家的身份没有那么渴望了哈哈。虽然最近比较忙,但是看到三周年纪念日的通知,还是想写一点什么,并不是因为三周年有多么值得纪念,而是这段时间确实有一些…...
Softmax 回归 + 损失函数 + 图片分类数据集
Softmax 回归 softmax 回归是机器学习另外一个非常经典且重要的模型,是一个分类问题。 下面先解释一下分类和回归的区别: 简单来说,分类问题从回归的单输出变成了多输出,输出的个数等于类别的个数。 实际上,对于分…...
基于云服务器的数仓搭建-hive/spark安装
mysql本地安装 安装流程(内存占用200M,升至2.1G) # 将资料里mysql文件夹及里面所有内容上传到/opt/software/mysql目录下 mkdir /opt/software/mysql cd /opt/software/mysql/ # 待上传文件 install_mysql.sh mysql-community-client-8.0.3…...
YOLO历代发展 图像增强方式 架构
YOLO1 YOLOV5 数据增强 mosaic 仿射变换(Affine)、透视变换(Perspective) 网络搭建...
Spring AI Alibaba EmbeddingModel使用
一、嵌入模型 (Embedding Model)简介 1、核心概念 嵌入模型(EmbeddingModel)是嵌入过程中采用的模型。 当前 EmbeddingModel的接口主要用于将文本转换为数值向量,接口的设计主要围绕这两个目标展开: 可移植性: 该接口…...
C++入门五式——类和对象(下)
目录 再探构造函数——初始化列表 类型转换 static成员 友元函数 内部类 匿名对象 再探构造函数——初始化列表 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表。 //初始化列…...
Spring的SPEL(Spring Expression Language)的使用说明,包含语法、示例和常见场景
以下是Spring的SPEL(Spring Expression Language)的使用说明,包含语法、示例和常见场景: 1. 基本语法 变量引用 表达式:#{变量名}(如#{systemProperties[os.name]})作用域:在Sprin…...
Linux应用:线程进阶
线程同步之信号量 信号量(Semaphore)是一个整型的计数器,用于控制对共享资源的访问。它通过 PV 操作来实现同步,P 操作将信号量的值减 1,如果值小于 0 则线程阻塞;V 操作将信号量的值加 1,如果…...
策略模式 (Strategy)
策略模式 (Strategy) 应用场景:用于处理不同的任务配置参数。在你的任务中,可能会有不同的任务类型,每个任务类型可能有不同的单位(比如米、毫米)或不同的处理方式。策略模式可以让你根据不同的任务类型选择不同的处理…...
【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet
主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: YOLOv8改进系列࿰…...