浅谈Thread类及常见方法与线程的状态(多线程编程篇2)
目录
前言
1.Thread类及常见方法
Thread类中常见的属性
1. getId()
2. getName()
3. getState()
4. getPriority()
5. isDaemon()
6. isAlive()
7. isInterrupted()
2.Thread类中常见的方法
Thread.interrupt() (中断线程)
Thread.start()(启动线程)
1. 覆写 run() 方法
2.调用start()
Thread.join()(等待线程)
3.线程的状态
1. NEW(新建)
2. RUNNABLE(运行中)
3. BLOCKED(阻塞)
4. WAITING(无限等待)
5. TIMED_WAITING(限时等待)
6. TERMINATED(终止)
结尾
前言
如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_如何查看weblogic当前线程-CSDN博客
距离笔者发布本系列第一篇博客已过去一月有余,本篇博客,笔者将继续介绍已经整理学习好的内容
既帮助未来的自己复习,也为正在阅读的你提供参考和思考.
本篇博客的内容正如标题所示,笔者主要将介绍一下内容
1.Thread类,并通过举例演示常见方法
2.向大家介绍线程的状态.
愿我们一起进步!
1.Thread类及常见方法
首先,需要说明的是,相比于多进程编程,多线程编程能够更有效地利用多核CPU资源。
线程作为进程中的执行单元,它们共享进程的内存空间,因此在创建、调度和销毁时所消耗的资源远少于进程。由于线程之间的开销较小,因此在多个线程之间的调度和切换效率较高。
Thread类中常见的属性
如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_如何查看weblogic当前线程-CSDN博客
1. getId()
-
功能:获取线程的唯一标识符(ID),和PID类似。每个线程都有一个唯一的 ID,它是一个正整数。这个ID是JAVA给分配的,不是系统API提供的,更不是PCB中的ID.
-
用途:可以用来标识不同的线程。
2. getName()
-
功能:获取线程的名称。每个线程都有一个名字,默认是
Thread-0
、Thread-1
等,当然也可以通过构造方法手动设置线程名称。 -
用途:帮助开发者区分不同的线程
3. getState()
-
功能:获取线程的状态,返回一个
Thread.State
枚举值。 -
用途:用于查看线程的当前状态
4. getPriority()
-
功能:获取线程的优先级。
-
用途:用于控制线程的调度顺序,优先级高的线程会比优先级低的线程更早得到 CPU 时间。
5. isDaemon()
-
功能:检查线程是否为守护线程(也可以叫做后台线程)(Daemon thread)。守护线程是辅助性线程,在所有非守护线程结束后会自动退出。
-
用途:判断线程是否为后台线程。守护线程一般用于系统服务或后台任务,如垃圾回收线程。
一般情况下,我们会默认一个线程为前台线程,一个JAVA进程中,如果前台线程没有执行结束,那么整个进程是一定不会结束的,但是后台进程是否结束了,不会影响整个进程的进行
举一个简单的例子 :
public class Demo2
{public static void main(String[] args) {Thread y = new Thread(() -> {while (true) {System.out.println("Test");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();throw new RuntimeException(e);}}}, "线程一"); // lambda 表达式写法y.setDaemon(true); // 设置为后台线程y.start(); // 启动线程}
}
如果在这里设置成后台线程,那么运行结果如下
进程已结束,退出代码0
或者
Test
进程已结束,退出代码0
如果y是一个前台线程,那么该程序应该一直打印"Test",但是我们在这里把他设置为了后台线程,
此时主线程立马就执行完了,由于没有其他前台线程了,因此进程结束了,y线程来不及执行,或者只能执行几次.
6. isAlive()
-
功能:检查线程是否处于活动状态。如果线程已经启动并且还没有终止,则返回
true
,否则返回false
。 -
用途:用于判断一个线程是否仍然在运行。
举个例子
public class Demo2
{public static void main(String[] args) throws InterruptedException {Thread y = new Thread(() -> {System.out.println("Test");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();throw new RuntimeException(e);}}, "线程一"); // lambda 表达式写法y.start(); // 启动线程System.out.println(y.isAlive());Thread.sleep(2000);System.out.println(y.isAlive());}
}
结果如下:
true
Test
false进程已结束,退出代码0
启动y线程后,线程存活,等待两秒后,线程的活动被终止
7. isInterrupted()
-
功能:检查线程是否被中断。如果线程被中断,返回
true
,否则返回false
。 -
用途:判断线程是否接收到中断信号。
2.Thread类中常见的方法
Thread.interrupt() (中断线程)
-
作用:中断线程的执行。
-
用途:通过调用该方法来中断一个线程的执行,线程可以通过
interrupted()
或isInterrupted()
方法判断是否被中断。
举个例子
结合我们刚刚提到的isInterrupted(),我们举一个例子
下面是一个线程执行的示例,线程会不断打印 "正在工作"
,直到被 interrupt()
发送中断信号后,它会检查自身的 isInterrupted()
状态并退出。
public class Demo4 {public static void main(String[] args) {Thread thread = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) { System.out.println("正在工作");try {Thread.sleep(1000); // 线程进入休眠状态} catch (InterruptedException e) {System.out.println("线程被中断,抛出异常终止");// 如果选择抛出异常,线程会立即终止// 当捕获到 InterruptedException 时,异常被重新抛出,// 这会导致当前线程的执行停止,不会继续执行 while 循环后面的代码。// 也就是说,抛出 RuntimeException 可能会导致线程提前结束。// throw new RuntimeException(e);// ✅ 如果使用 break,则线程可以优雅退出// break;}}// ⚠ 只有在没有抛出异常时,这行代码才会执行System.out.println("工作结束"); });thread.start();try {Thread.sleep(3000); // 主线程等待 3 秒} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt(); // 发送中断信号System.out.println("已通知线程中断");}
}
值得注意的就是这里要不要 throw new RuntimeException(e)
而关于Thread.currentThread()
在 Java 中,Thread.currentThread()
返回当前正在执行的线程对象。因为 thread
变量指向的是主线程创建的线程实例,而 Thread.currentThread()
总是指向当前正在运行的线程,因此在线程内部调用 Thread.currentThread().isInterrupted()
可以正确获取线程的中断状态。
并且,即使线程内部的逻辑出现阻塞,也可以用这个方法唤醒,正常来说,sleep会休眠到时间到了才唤醒,但是interrupt()方法 可以使sleep内部出发异常,从而被提前唤醒,如果我们自己定义标注为,就做不到
效果如下:
但是sleep方法抛出异常,同时也会自动清除刚才设置的标志位,所以我们的线程会继续工作,所以我们需要break优雅地去中断.
我们再总结一下
1.如果只捕获异常,不做处理
try {Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace(); // 仅打印异常
}
标志位会被清除,但是线程不会停止,将继续工作
2.使用break;
try {Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace(); // 仅打印异常break;
}
线程不会抛出异常,而是优雅退出循环。
while
结束后,线程会执行"工作结束"
语句并结束。
3.你选择抛出异常
try {Thread.sleep(1000);
} catch (InterruptedException e) {throw new RuntimeException(e);
}
线程会立即终止,不会执行
while
循环后面的代码。"工作结束" 也不会被打印,因为
while
之后的代码永远不会执行。
读者们可以把代码拷到自己的环境里去试验一下,笔者下的结论建立在试验过的基础之上.
Thread.start()(启动线程)
这里笔者主要是谈一下覆写RUN方法和调用start()方法的区别,它们有什么区别呢?
1. 覆写 run()
方法
run()
方法是 Thread
类的一个普通方法,如果我们直接调用 run()
,它不会启动一个新的线程,而是作为当前线程中的一个普通方法执行。例如:
class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程正在执行: " + Thread.currentThread().getName());}
}public class Main {public static void main(String[] args) {MyThread t1 = new MyThread();t1.run(); // 直接调用 run()System.out.println("主线程执行完毕");}
}
效果如下:
可以看到,run()
方法是在 主线程 中执行的,而不是在一个新的线程中。
2.调用start()
start()
方法是 Thread
类的核心方法,调用 start()
后,JVM 会创建一个新的线程,并调用该线程的 run()
方法,从而实现真正的并发执行。例如:
class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程正在执行: " + Thread.currentThread().getName());}
}public class Main {public static void main(String[] args) {MyThread t1 = new MyThread();t1.start(); // 启动新线程System.out.println("主线程执行完毕");}
}
代码效果:
主线程执行完毕
线程正在执行: Thread-0进程已结束,退出代码0
通俗来说,假设我是经理,我把我的下属员工张三喊过来,我告诉张三他这周的工作任务现在,我让他行动起来.
在这段文字中:
-
"我是经理" → 你是主线程 (
main
线程)。 -
"把张三喊过来" → 你创建了一个线程对象 (
new Thread()
)。 -
"我告诉张三他的工作任务" → 你覆写了
run()
方法,定义了线程要执行的内容。 -
"我让张三行动起来"==
start()
→ 你调用了start()
方法,让张三真正开始工作,并且他是独立工作的,你自己(主线程)也可以去做别的事了。 -
"如果我只是告诉张三他的工作任务,而没让他行动"==
run()
→ 你只是调用了run()
方法,这样张三不会真正开始工作,而是你自己(经理)亲自去做他的工作(主线程执行run()
里面的内容)。
Thread.join()(等待线程)
在 Java 线程编程中,join()
方法用于让当前线程等待另一个线程执行完成,然后才继续执行。它的作用是同步线程,确保某个线程执行完毕后,其他线程才能继续运行。
例如现在有一个线程t,如果主线程调用t.join(),那么主线程就会进入阻塞状态,等待t线程先执行完
笔者再给一个示例代码:
class Worker extends Thread {private String name;public Worker(String name) {this.name = name;}@Overridepublic void run() {System.out.println(name + " 开始工作...");try {Thread.sleep(2000); // 模拟任务执行 2 秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + " 工作完成!");}
}public class JoinExample {public static void main(String[] args) {Worker worker1 = new Worker("张三");Worker worker2 = new Worker("李四");worker1.start();worker2.start();try {worker1.join(); // 等待 worker1 执行完worker2.join(); // 等待 worker2 执行完} catch (InterruptedException e) {e.printStackTrace();}System.out.println("所有工作完成,主线程继续执行!");}
}
效果如下:
张三 开始工作...
李四 开始工作...
张三 工作完成!
李四 工作完成!
所有工作完成,主线程继续执行!
又或者,我们希望多个线程按照一定顺序进行,也可以使用join()方法
例如:
public class JoinExample {public static void main(String[] args) {Thread thread1 = new Thread(() -> {System.out.println("线程 1 执行");});Thread thread2 = new Thread(() -> {System.out.println("线程 2 执行");});Thread thread3 = new Thread(() -> {System.out.println("线程 3 执行");});try {thread1.start();thread1.join(); // 等待 thread1 结束thread2.start();thread2.join(); // 等待 thread2 结束thread3.start();thread3.join(); // 等待 thread3 结束} catch (InterruptedException e) {e.printStackTrace();}System.out.println("所有线程执行完毕!");}
}
在main线程中那个线程调用了join()方法, main线程就一定要等待该线程执行完,然后才能接着执行
效果如下:
线程 1 执行
线程 2 执行
线程 3 执行
所有线程执行完毕!
感兴趣的读者们可以把代码拷到自己的环境中去尝试 !
3.线程的状态
我们如果想涉及多线程的安全问题, 那我我们就必须先知道多线程有哪些状态?
前面我们提到过 getState() 可以获取当前线程的状态
public class ThreadState {public static void main(String[] args) {// 遍历 Thread.State 枚举中的所有状态for (Thread.State state : Thread.State.values()) {// 输出每种状态System.out.println(state);}}
}
NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
TERMINATED进程已结束,退出代码0
1. NEW(新建)
-
线程刚刚被创建,还 没有启动,此时线程对象已经被分配内存,但还未执行
start()
方法。 -
特征:未执行任何代码。
Thread thread = new Thread(() -> System.out.println("Hello"));
System.out.println(thread.getState()); // NEW
2. RUNNABLE(运行中)
-
线程已经 调用
start()
方法,并且 可能正在运行,也可能在等待 CPU 调度(就绪)。 -
这个状态表示线程 可运行,但 不一定正在运行(因为可能在 CPU 时间片等待中)。
Thread thread = new Thread(() -> {while (true) {} // 无限循环,保持线程存活
});
thread.start();
System.out.println(thread.getState()); // RUNNABLE
3. BLOCKED(阻塞)
-
线程 等待获取锁,但该锁 被其他线程持有,导致线程无法继续执行。
-
特征:只能用于同步代码块(
synchronized
),等待进入临界区。
4. WAITING(无限等待)
-
线程 无限期等待,直到 被其他线程显式唤醒(
notify()
或notifyAll()
)。 -
特征:不会自动恢复,必须 由其他线程唤醒。
5. TIMED_WAITING(限时等待)
-
线程进入 限时等待状态,会在指定时间后自动恢复。
-
特征:等待 超时后自动唤醒,无需其他线程干预。
6. TERMINATED(终止)
-
线程执行完
run()
方法,或者 抛出未捕获异常 导致终止。 -
线程生命周期结束,不能再
start()
。
结尾
写到这里,笔者就暂时停笔了,知识简单但是汇总不易,实验的结果都是笔者自己写代码自己试验出来的,希望对读者有用,可以的话,请您投个票
相关文章:
浅谈Thread类及常见方法与线程的状态(多线程编程篇2)
目录 前言 1.Thread类及常见方法 Thread类中常见的属性 1. getId() 2. getName() 3. getState() 4. getPriority() 5. isDaemon() 6. isAlive() 7. isInterrupted() 2.Thread类中常见的方法 Thread.interrupt() (中断线程) Thread.start()(启动线程) 1. 覆写 run…...
算法刷题记录——LeetCode篇(1.2) [第11~20题](持续更新)
更新时间:2025-03-29 LeetCode题解专栏:实战算法解题 (专栏)技术博客总目录:计算机技术系列目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 17. 电话号码的字母组合 给定一个仅包含数字 2-9…...
基于HTML5和CSS3实现3D旋转相册效果
基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…...
unity中Xcharts图表鼠标悬浮表现异常
鼠标悬浮在面板附近,只显示单独的一个项目 而且无论鼠标如何移动,根本没有效果。 解决方案: 需要在对应的Canvas上绑定主相机才可以 鼠标移动到项目上就有信息展示了...
Unity程序嵌入Qt后点击UI按钮Button没有反应
一、前言 在一次项目中,需要将Unity程序嵌入qt中,并在主界面显示,根据网络资料与相关代码,成功将unity程序嵌入,但是在点击Unity的Button按钮时却没有响应,在查找相关资料后,解决问题ÿ…...
Linux安装Cmake (Centos 7.9)
cmake安装 这个虽然已经更新到了4.0.0版本了,但是我们要用3.5版本的,因为这个比较稳定 官方地址:https://github.com/Kitware/CMake/releases/tag/v3.5.0,选择那个cmake-3.5.0-Linux-x86_64.tar.gz下载, 首先解压文…...
31天Python入门——第14天:异常处理
你好,我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…...
Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题
一、问题 在使用集群服务器前可以查看导入,module load不需要安装。我都是自己重新下载Anaconda3-2024.10-1-Linux-x86_64.sh,然后安装,导致混乱。下面是情况 1.创建的环境名跑到目录下了 2.多个base,且有个base无显示 二、解决办法 1.删…...
【Linux】B站黑马程序视频学习笔记(一)
一、Linux内核与发行版 注意:下图程序指向内核的箭头用的是“调用”,内核指向硬件用的是“调度”。 Linux内核代码下载网站:https://www.kernel.org/ 二、虚拟机-VMware 学习Linux可以借助虚拟机(其使用到的CPU、内存、硬盘都是…...
HarmonyOS NEXT——【鸿蒙原生应用加载Web页面】
鸿蒙客户端加载Web页面: 在鸿蒙原生应用中,我们需要使用前端页面做混合开发,方法之一是使用Web组件直接加载前端页面,其中WebView提供了一系列相关的方法适配鸿蒙原生与web之间的使用。 效果 web页面展示: Column()…...
【软件工程】习题及答案
目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1.关于引起软件危机的原因ÿ…...
css选择最后结尾的元素DOM
前言 选中最后一个元素,实际使用非常频繁。 解决方案 使用 CSS 提供的选择器,即可完成。 如下代码示例,两种选择器均可实现。 <p>...</p>p:last-child{ background:#ff0000; }p:nth-last-child(1){background:#ff0000; }p&…...
【AI论文】挑战推理的边界:大型语言模型的数学基准测试
摘要:近年来,大型推理模型的迅猛发展导致现有用于评估数学推理能力的基准测试趋于饱和,这凸显出迫切需要更具挑战性和严谨性的评估框架。为填补这一空白,我们推出了OlymMATH,这是一项全新的奥林匹克级数学基准测试&…...
使用 Python包管理工具 uv 完成 Open WebUI 的安装
uv 是一个极其快速的 Python 包安装器和解析器,用 Rust 编写,旨在作为 pip 和 pip-tools 工作流的替代品 使用 uv 安装(推荐) macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | shWindows: po…...
【区块链安全 | 第三篇】主流公链以太坊运行机制
文章目录 1. 以太坊账户类型2. 以太坊网络架构2.1 节点类型2.2 交易流程 3. 共识机制4. Gas 机制4.1 Gas 计算方式4.2 以太坊 EIP-1559 交易机制 5. EVM(以太坊虚拟机)5.1 EVM 结构5.2 EVM 指令5.3 EVM 运行机制 6. 智能合约7. ERC 代币标准7.1 ERC-207.…...
C# 字符串(String)
C# 字符串(String) 引言 在C#编程语言中,字符串(String)是处理文本数据的基础。字符串是字符的有序集合,用于存储和处理文本信息。C#的字符串类型是System.String,它是一个引用类型࿰…...
Unity Shader 学习18:Shader书写基本功整理
1. Drawer [HideInInspector]:面板上隐藏[NoScaleOffset]:隐藏该纹理贴图的TillingOffset[Normal]:检查该纹理是否设为法线贴图[HDR]:将颜色类型设为高动态范围颜色(摄像机也要开启HDR才有效果)[PowerSlid…...
构建第一个SpringBoot程序
第一种方式: 注,构建过程中一定要联网 new module -->选择spring Initializr 选择Web --> 勾选Spring Web --> create 构建好的项目如下 这里的 .mvn .git* HELP.md mvnw* 都可以删除 编辑好controller 之后 点击即可运行第一个springbo…...
Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
JVM是Java高级部分,深入理解程序的运行及原理,面试中也问的比较多。 JVM是Java程序运行的虚拟机环境,实现了“一次编写,到处运行”。它负责将字节码解释或编译为机器码,管理内存和资源,并提供运行时环境&a…...
使用飞书API自动化更新共享表格数据
飞书API开发之自动更新共享表格 天马行空需求需求拆解1、网站数据爬取2、飞书API调用2.1 开发流程2.2 创建应用2.3 配置应用2.4 发布应用2.5 修改表格权限2.6 获取tenant_access_token2.7 调用API插入数据 总结 天马行空 之前一直都是更新的爬虫逆向内容,工作中基本…...
C++中ShellExecute函数使用方法说明,如果一开始参数为隐藏,后面还能再显示出来吗
文章目录 一、ShellExecute基础用法函数原型关键参数 nShowCmd示例代码:启动程序并隐藏窗口 二、隐藏后能否重新显示窗口直接答案 三、实现隐藏后显示窗口的步骤1. 获取目标窗口句柄2. 显示窗口 四、完整流程示例五、注意事项六、总结 在C中使用ShellExecute函数时&…...
MySQL的多表查询
我们之前在讲解SQL语句的时候,讲解了DQL语句,也就是数据查询语句,但是之前讲解的查询都是单表查询,而本章节我们要学习的则是多表查询操作,主要从以下几个方面进行讲解。 5.1 多表关系 项目开发中,在进行…...
(UI自动化测试web端)第二篇:元素定位的方法_css定位之层级选择器
看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写? 文章介绍了第五种写法,层级选择器 ,你要根据网页中的实际情况来判断自己到底要用哪一种方法来进行元素定位。每种方法都要多练习,全都熟了之后你在工作当中使…...
《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务
《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务(上) 摘要: 在 FastAPI 和 OLLAMA 架构中实现高并发 AI 推理服务,并优化性能指标采集和缓存策略,可以充分利用 asy…...
【LeetCode 题解】算法:8.字符串转换整数(atoi)
一、问题描述 在 LeetCode 的算法题库里,有这样一道题目,要求我们实现一个名为 myAtoi(string s) 的函数,其功能是将给定的字符串转换为一个 32 位有符号整数。具体的转换规则如下: 处理步骤 剔除前导空格:读取字符串…...
Uni-app页面信息与元素影响解析
获取窗口信息uni.getWindowInfo {pixelRatio: 3safeArea:{bottom: 778height: 731left: 0right: 375top: 47width: 375}safeAreaInsets: {top: 47, left: 0, right: 0, bottom: 34},screenHeight: 812,screenTop: 0,screenWidth: 375,statusBarHeight: 47,windowBottom: 0,win…...
飞书电子表格自建应用
背景 coze官方的插件不支持更多的飞书电子表格操作,因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后,就可以拿到id和key 参考教程: 创…...
《云原生安全攻防》-- K8s容器安全:权限最小化与SecurityContext
一旦容器被入侵,攻击者就可以获取到容器的权限,所以,容器运行过程中,我们首先需要考虑的是容器的权限问题。 在本节课程中,我们将重点介绍权限最小化以及如何使用SecurityContext来管理容器的权限。 在这个课程中&…...
uniapp中的流式输出
一、完整代码展示 目前大多数的ai对话都是流式输出,也就是对话是一个字或者多个字逐一进行显示的下面是一个完整的流式显示程序,包含的用户的消息发出和ai的消息回复 <template><view class"chat-container"><view class&quo…...
PipeWire 音频设计与实现分析一——介绍
PipeWire 是一个基于图的媒体处理引擎,一个可以运行多媒体节点图的媒体服务器,是 Linux 的音频/视频总线,它管理 Linux 系统中,不同应用程序对音频和视频设备的共享访问。它提供了一个本地客户端音频 API,但也提供兼容…...
MVC 文件夹:架构之美,开发之魂
MVC 文件夹:架构之美,开发之魂 引言 在软件开发领域,MVC(Model-View-Controller)架构模式已经成为了一种广泛应用的架构设计理念。它将应用程序分为三个核心部分:模型(Model)、视图…...
IO模型之于并发编程模型、并发模型之于架构模式
一、并发编程模型主要包括以下几种: 多进程模型:利用操作系统的进程模型来实现并发。每个用户请求接入时都会创建一个进程,适用于I/O密集型任务。缺点是创建进程的开销高,且上下文切换的开销也大。典型应用如Apache Web Ser…...
Postman 7.3.5 旧版下载指南(Win64)及注意事项
Postman-win64-7.3.5-Setup 是 Postman 的一个旧版本(2019年发布,适用于 Windows 64位系统)。以下是相关信息和建议: 1. Postman 7.3.5 版本说明 功能:用于 API 开发、测试和协作。 系统要求:Windows 64位…...
Flink/Kafka在python中的用处
一、基础概念 1. Apache Kafka 是什么? 核心功能:Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流式应用程序。核心概念: 生产者(Producer):向 Kafka 发送数据的程序。…...
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章:经过前九篇 [【深度 Mape 系列】] 的系统学习…...
轻松理解Python装饰器:从基础到应用
一、为什么需要装饰器 想象一下,你写了很多函数来完成不同的任务,突然有个新需求:在每个函数执行前打印一条“函数开始执行”的消息,执行后打印“函数执行结束”。如果没有装饰器,你就得在每个函数里手动添加这两条打…...
RabbitMQ 技术详解:异步消息通信的核心原理与实践
这里写目录标题 RabbitMQ 技术详解:异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置(Maven)2. 消…...
MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性
目录 一,多表查询的分类 角度1:等值连接 vs 非等值连接 角度2:自连接 vs 非自连接 角度3:内连接 vs 外连接 二,SQL92语法实现内连接:见上,略SQL92语法实现外连接:使用 -…...
Selenium文件上传
在 Web 自动化测试中,文件上传是一项常见的任务。不同的网站和前端技术可能导致上传方式有所不同,因此需要采用不同的方法进行处理。 方法 1:使用 send_keys() 直接上传(最常用) 适用场景: 页面中 有标准的 <input type="file"> 标签。 不需要弹出 Wind…...
getID3获取本地或远程视频时长
音频文件也可使用,使用ffmeg安装太复杂了 附ffmpeg方式:centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…...
OpenAI流式解析
OpenAI 流式的代码: 首选一般请使用os.getenv 去读环境变量的内容 注意使用pip install python-dotenv 的安装方法 load_dotenv 是这个库提供的一个函数,用于读取 .env 文件并将其中定义的键值对设置为系统的环境变量。 默认情况下,load_…...
在Trae中设置Python解释器版本
Python 是一种广泛使用的高级编程语言,因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展,多个版本相继发布,每个版本都带来了新特性和改进。然而,这也带来了一些问题,比如不同的工程,需要…...
第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes
优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...
图像数据增强教程:为目标检测任务准备数据
目录 一、简介 二、代码结构 三、环境要求 四、数据增强类 4.1 调整增强概率和参数 4.2 增强方法参数 五、数据增强主函数 六、主函数 效果展示 完整代码 一、简介 在目标检测任务中,数据增强是一种关键技术,通过对原始图像应用多种变换来增加…...
Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...
HarmonyOS WebSocket全场景应用开发深度解析
注:适用版本(Harmony OS NEXT / 5.0 / API 12 ) 一、最终效果预览 二、基础代码结构 Entry Component struct ChatApp {State messages: Message[] [] // 所有聊天记录State inputText: string "" // 输入框内容State isCon…...
JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测
JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…...
ubuntu 安装 postgresql
在 Ubuntu 系统中安装 PostgreSQL 的步骤如下: 步骤 1:更新软件包列表 sudo apt update步骤 2:安装 PostgreSQL Ubuntu 默认仓库包含 PostgreSQL,直接安装: sudo apt install postgresql postgresql-contrib -ypost…...
深入实践:基于WebSocket的全球化金融数据实时对接方案。 马来西亚、印度、美国金融数据API
深入实践:基于WebSocket的全球化金融数据实时对接方案 在全球金融市场中,实时数据的高效获取与处理是量化交易、行情监控等场景的核心能力。本文将以技术实践为核心,详细解析如何通过WebSocket技术实现美国、印度、马来西亚等多国金融数据&a…...
深度学习处理时间序列(5)
Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过,二者有一点小区别:SimpleRNN层能够像其他Keras层一样处理序列批量,而不是像NumPy示例中的那样只能处理单个序列。也就是说,它接收形状为(batch_si…...