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

30天学Java第九天——线程

并行与并发的区别

  • 并行是多核 CPU 上的多任务处理,多个任务在同一时间真正的同时执行
  • 并发是单核 CPU 上的多任务处理,多个任务在同一时间段内交替执行,通过时间片轮转实现交替执行,用于解决 IO 密集型任务的瓶颈

线程的创建方式

Thread 的构造方法,可以在创建线程的时候为线程起名字
在这里插入图片描述

  1. 第一种方法:继承 Thread 类
    • 第一步:编写一个类继承 Thread
    • 第二步:重写 run 方法
    • 第三步:new 线程对象
    • 第四步:调用线程对象的 start 方法,启动线程
      一定调用的是 start 方法,不是 run 方法。start 方法的作用就是启动一个线程,线程启动完成该方法就结束。
public class MyThread {public static void main(String[] args) {NewThread nt = new NewThread();// 启动 start 方法启动线程,而不是 run 方法nt.start();for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + " " + i);}}
}class NewThread extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + " " + i);}}
}
对比一下 run 方法与 start 方法的内存图

调用 run 方法的内存图
调用 run 方法并没有启动新线程,代码都是在 main 方法中执行的,内存只有一个主线程的栈,因此必须 run 方法中的代码执行玩,才能执行后续的代码
在这里插入图片描述
调用 start 方法的内存图
调用 start 方法会启动一个新线程,内存会分配一个新的栈空间给新线程(分配完成start方法就结束了,main 方法中的代码继续向下执行),新线程的代码在新的栈空间执行,main 方法的代码在 main 方法的栈空间执行,两个线程抢夺 CPU 时间片交替执行。
在这里插入图片描述
2. 第二种方法:实现 Runnable 接口

  • 第一步:编写一个类实现 Runnable 接口
  • 第二步:实现接口中的 run 方法
  • 第三步:new 线程对象
    使用Thread的带有 Runnable 参数的构造方法创建对象
    在这里插入图片描述
  • 第四步:调用线程对象的 start 方法,启动线程

推荐使用这种而不是第一种,因为第一种方式使用继承,而Java只能单继承,因此失去了继承其他类的能力,而 实现 Runnable 接口则还能继承其他类

  1. 实现 Callable 接口
  • 第一步:编写一个类实现 Callable 接口
  • 第二步:实现接口中的 run 方法
  • 第三步:new 线程对象
  • 第四步:调用线程对象的 start 方法,启动线程

线程常用的三个方法

  1. final String getName():返回此线程的名称。
  2. final void setName(String name):将此线程的名称更改为等于参数 name 。
  3. static Thread currentThread():返回对当前正在执行的线程对象的引用。

线程七个生命周期

  1. NEW:新建状态
    当线程被创建但尚未开始运行时,它处于新建状态。在这个阶段,线程对象被实例化,但尚未调用 start() 方法。
  2. RUNNABLE:可运行状态
    • 就绪状态
      一旦调用了 start() 方法,线程进入就绪状态。在这个状态下,线程准备好运行,并等待线程调度程序的分配。此状态并不一定代表线程正在运行,可能会处于等待获取CPU时间片的状态。
    • 运行状态
      线程获得CPU资源并开始执行其任务时,线程进入运行状态。在这个状态下,线程执行其代码。
  3. BLOCKED:阻塞状态
    当线程尝试获取一个已经被其他线程持有的锁时,它会进入阻塞状态。在这个状态下,线程无法继续执行,直到它获得所需的锁。
  4. WAITING:等待状态
    如果线程调用 wait()、join() 或 LockSupport.park() 方法,它会进入等待状态。在这种状态下,线程会等待其他线程通知或唤醒它。
  5. TIMED_WAITING:超时等待状态
    线程在等待的同时设置了时间限制(例如,调用 sleep(milliseconds) 或 wait(milliseconds)),将进入超时等待状态。如果在超时时间到达之前线程未被唤醒,则该线程会返回到就绪状态。
  6. TERMINATED:终止/死亡状态
    当线程的 run() 方法执行完毕或者因异常终止时,线程进入终止状态。在这个状态下,线程完成了它的生命周期,无法重新启动。

线程常用的调度方法

  1. start()
    用于启动线程,使其进入就绪状态。
  2. sleep(long millis)
    使当前正在执行的线程暂停指定的时间,被调用的线程会进入阻塞状态,在指定的毫秒数后,线程会回到就绪状态。
  3. yield()
    暂时让出当前线程的执行权,该方法提示线程调度器允许其他同等优先级的线程获得执行时间。
    并不保证在调用后立即释放控制权。
    让位后的线程进入就绪状态,并不会阻塞。
  4. join()
    等待一个线程完成,如果线程 A 调用线程 B 的 join() 方法,线程 A 会阻塞,直到线程 B 执行完毕并终止。
    join(long millis) 方法也可以指定时间,指的是加入 A 线程的时间或者说阻塞 A 线程的时间,时间一到就退出。如果在指定的 millis 时间内,B 线程结束了,被阻塞的 A 线程也会结束阻塞状态。
  5. interrupt()
    发送一个中断信号给线程。如果线程正处于等待、睡眠或阻塞状态,将会抛出InterruptedException。抛出异常就会导致线程退出等待、睡眠或阻塞状态,从而达到中断的目的,利用了异常的机制。
  6. setPriority(int newPriority)
    设置线程的优先级。线程的优先级是一个整数值,范围从1(最低)到10(最高)。这并不保证线程会按优先级执行,但可以指示调度器的优先级。
  7. wait() 和 notify()
    用于线程间的通信和协作。wait() 使线程在对象监视器上等待,直到其他线程调用 notify() 或 notifyAll() 来唤醒它。

如何强制结束一个线程

Thread.stop() 方法可以强制结束线程,但是在 Java1.2 之后就被弃用了,因为使用 stop() 方法会导致线程立即终止,这可能导致锁未解锁、文件未正确关闭等情况,因此强烈不推荐。更好的办法是使用标志位或者 interrupt() 方法。

  1. 设置标志位方法
    通过使用一个共享的标志位来控制线程的生命周期是推荐的做法。主线程可以通过设置标志位来通知子线程应停止执行。
    class CustomThread extends Thread {  private volatile boolean running = true; // 使用 volatile 关键字确保可见性  public void run() {  while (running) {  // 执行任务  System.out.println("Thread is running...");  try {  Thread.sleep(500); // 模拟工作  } catch (InterruptedException e) {  Thread.currentThread().interrupt(); // 恢复中断状态  }  }  System.out.println("Thread is stopping...");  }  public void stopRunning() {  running = false; // 设置标志位  }  
    }  public class Main {  public static void main(String[] args) throws InterruptedException {  CustomThread thread = new CustomThread();  thread.start();  Thread.sleep(2000); // 让线程运行2秒  thread.stopRunning(); // 请求线程停止  thread.join(); // 等待线程结束  System.out.println("Main thread finished.");  }  
    }
    
  2. 使用 interrupt() 方法
    在Java中,interrupt() 方法可以用于中断一个线程。线程在被中断时可以选择捕捉异常或者检查中断状态,从而优雅地结束自己。
    class InterruptibleThread extends Thread {  public void run() {  try {  while (!Thread.currentThread().isInterrupted()) {  // 执行任务  System.out.println("Thread is running...");  Thread.sleep(500); // 模拟工作  }  } catch (InterruptedException e) {  // 捕捉到中断异常,线程可以选择停止  System.out.println("Thread was interrupted.");  Thread.currentThread().interrupt(); // 重新设置中断状态  }  System.out.println("Thread is stopping...");  }  
    }  public class Main {  public static void main(String[] args) throws InterruptedException {  InterruptibleThread thread = new InterruptibleThread();  thread.start();  Thread.sleep(2000); // 让线程运行2秒  thread.interrupt(); // 中断线程  thread.join(); // 等待线程结束  System.out.println("Main thread finished.");  }  
    }
    

守护线程

在 Java 中,线程被分为两大类,一类是用户线程,一类是守护线程。
在 JVM 中,有一个隐藏的守护线程就是 GC 线程

守护线程的特点:

  • 后台运行: 守护线程通常是后台执行的,用于执行一些辅助任务,比如垃圾回收、线程池中的工作线程等。
  • 生命周期受限: JVM 会在所有非守护线程结束后自动结束守护线程。如果没有非守护线程在运行,JVM会退出。
  • 优先级: 守护线程的优先级与普通线程相同,但它们的作用通常是协助非守护线程。

如何创建守护线程

三个步骤创建守护线程:

  1. 创建一个线程实例
  2. 调用 setDaemon(true) 方法,将该线程设置为守护线程
  3. 启动线程
class DaemonThread extends Thread {  @Override  public void run() {  while (true) {  System.out.println("Daemon thread is running...");  try {  Thread.sleep(1000); // 模拟一些工作  } catch (InterruptedException e) {  System.out.println("Daemon thread interrupted.");  }  }  }  
}  public class Main {  public static void main(String[] args) {  Thread daemonThread = new DaemonThread();  daemonThread.setDaemon(true); // 设置为守护线程  daemonThread.start();  try {  Thread.sleep(3000); // 主线程睡眠3秒  } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println("Main thread is ending...");  // 主线程结束,Daemon线程会随之结束  }  
}

定时任务

在Java中,Timer 是一个用于调度任务的工具类,允许开发者在指定的时间间隔内重复执行任务或在特定的时间点执行任务。Timer 类通常与 TimerTask 类一起使用,其功能足够简单,适合于许多基本的定时任务需求。
Timer: 一个定时器,负责调度任务。
在这里插入图片描述
TimerTask: 一个抽象类,所有需要被调度的任务都需要继承这个类并重写 run() 方法。
在这里插入图片描述

创建定时任务

使用 Timer 和 TimerTask 来创建定时任务的基本步骤如下:

  1. 创建一个 Timer 实例。
  2. 创建一个继承自 TimerTask 的类,并实现 run() 方法。
  3. 使用 Timer 的 schedule() 或 scheduleAtFixedRate() 方法将任务和执行时间关联。

常用方法

  • schedule(TimerTask task, long delay): 在指定的延迟后调度任务。
  • schedule(TimerTask task, Date time): 在指定的时间执行任务。
  • schedule(TimerTask task, long delay, long period): 设定任务在指定的延迟后每隔一个时间段再次执行。
  • scheduleAtFixedRate(TimerTask task, long delay, long period): 类似于 schedule,但是以固定率运行,适用于需要固定间隔执行的任务。
import java.util.Timer;  
import java.util.TimerTask;  public class TimerExample {  public static void main(String[] args) {  Timer timer = new Timer(); // 创建定时器  TimerTask task = new TimerTask() {  @Override  public void run() {  System.out.println("Task executed at: " + System.currentTimeMillis());  }  };  // 在延迟 1 秒后执行任务,每隔 2 秒重复执行  timer.scheduleAtFixedRate(task, 1000, 2000);  // 主线程睡眠 10 秒,以便观察输出  try {  Thread.sleep(10000);  } catch (InterruptedException e) {  e.printStackTrace();  }  // 取消定时器  timer.cancel();  System.out.println("Timer canceled.");  }  
}

注意事项

  • 单线程中: Timer 是单线程的,如果一个 TimerTask 执行时间超过下一个任务的调度时间,后续的任务会被延迟执行。
  • 异常处理: 如果 TimerTask 中的代码抛出未处理的异常,Timer 将停止执行所有后续任务。应确保 run() 方法内的代码是异常安全的。
  • 使用 ScheduledExecutorService: 对于更复杂的定时任务需求(例如线程池,多线程调度等),建议使用 ScheduledExecutorService,它提供了更强大的功能和灵活性。
    import java.util.concurrent.*;  public class ScheduledExecutorExample {  public static void main(String[] args) {  ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);  Runnable task = () -> {  System.out.println("Task executed at: " + System.currentTimeMillis());  };  // 在延迟 1 秒后执行,每隔 2 秒重复执行  scheduler.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);  // 主线程睡眠 10 秒,以便观察输出  try {  Thread.sleep(10000);  } catch (InterruptedException e) {  e.printStackTrace();  }  // 关闭调度器  scheduler.shutdown();  System.out.println("Scheduler shut down.");  }  
    }
    
  • 开发中一般不使用 Timer ,有一些更好的框架可以设置定时任务。

线程优先级

  • 线程是可以设置优先级的,优先级高的,获得CPU时间片的概率会高一些
  • JVM 采用的是抢占式调度模式。谁的优先级高,获取 CPU 的概率就会高
  • 默认情况下,一个线程的优先级是 5
  • 线程优先级最低是 1,最高是 10
  • Thread 类的字段属性
    可以通过 MAX_PRIORITY 和 MIN_PRIORITY,设置最高最低优先级
    在这里插入图片描述

线程安全

什么情况下需要考虑线程安全问题?

  1. 多线程的并发环境下
  2. 有共享的数据
  3. 共享数据涉及到修改操作

一般情况下,局部变量不存在线程安全问题,实例变量和静态变量可能存在线程安全问题。因为局部遍历存储在栈中,实例变量和静态变量存储在堆中,栈每个线程使用自己的,而堆是多线程共享的。

相关文章:

30天学Java第九天——线程

并行与并发的区别 并行是多核 CPU 上的多任务处理&#xff0c;多个任务在同一时间真正的同时执行并发是单核 CPU 上的多任务处理&#xff0c;多个任务在同一时间段内交替执行&#xff0c;通过时间片轮转实现交替执行&#xff0c;用于解决 IO 密集型任务的瓶颈 线程的创建方式…...

SaaS微服务架构的智慧工地源码,基于Spring Cloud +UniApp +MySql开发

基于微服务架构JavaSpring Cloud UniApp MySql技术开发&#xff0c;saas模式的一套智慧工地云平台源码&#xff0c;支持多端展示&#xff1a;PC端、大屏端、手机端、平板端。包含项目人员管理、视频监控管理、危大工程监管、绿色施工管理、现场物料管理、安全隐患排查等功能。 …...

Qt学习笔记——TableWidget的一些学习东西

TableWidget的一些学习东西 使用QtDesigner绘制表格&#xff0c;但是表格出现很多问题&#xff0c;烦死了&#xff0c;整理了一些内容。 在使用 Qt Designer 设置 QTableWidget 时&#xff0c;涉及大量属性选项&#xff0c;尤其是在初学阶段常常因为属性设置不当而导致表格显…...

《Uniapp-Vue 3-TS 实战开发》Pinia 及 Pinia 持久化

前言: 正文: 一、Pinia 基础用法 1. 安装与初始化 bash npm install pinia # 或 yarn add pinia 在 main.js/ts 中初始化: import { createApp } from vue import { createPinia } from pinia import App from ./App.vue const app = createApp(App) app.use(createPinia()…...

JAVA:SpringBoot 实现图片防盗链的技术指南

1、简述 防盗链(Hotlink Protection)是一种保护网站资源不被其他网站直接引用的技术,特别是在图片、视频等静态资源方面。防盗链的核心思想是检查请求的来源(Referer),只允许来自指定域名的请求访问资源。 在 Spring Boot 中,我们可以通过拦截器(Interceptor)或过滤…...

量子指纹识别

场景设定 某金融机构部署量子指纹认证系统&#xff0c;要求用户通过手机&#xff08;传感器A&#xff09;注册指纹&#xff0c;并在ATM机&#xff08;传感器B&#xff09;完成量子安全认证。系统需满足&#xff1a; 抗模板泄露&#xff1a;即使数据库被攻破&#xff0c;攻击者…...

图像变换方式区别对比(Opencv)

1. 变换示例 import cv2 import matplotlib.pyplot as plotimg cv2.imread(url) img_cut img[100:200, 200:300] img_rsize cv2.resize(img, (50, 50)) (hight,width) img.shape[:2] rotate_matrix cv2.getRotationMatrix2D((hight//2, width//2), 50, 1) img_wa cv2.wa…...

快速上手Linux联网管理

RHEL9版本特点 在RHEL7版本中&#xff0c;同时支持network.service和NetworkManager.service&#xff08;简称NM&#xff09;。在RHEL8上默认只能通过NM进行网络配置&#xff0c;包括动态ip和静态ip,若不开启NM&#xff0c;否则无法使用网络RHEL8依然支持network.service&…...

加速度计芯片的主要参数定义、计算、测试方法

加速度计的主要参数包括量程、分辨率、灵敏度、输出数据速率、接口类型、功耗、噪声等。量程决定了加速度的测量范围&#xff0c;比如2g到16g&#xff0c;不同的应用需要不同的量程。分辨率关系到能检测到的最小变化&#xff0c;通常用位数表示&#xff0c;比如12位或16位。灵敏…...

FFMPEG大文件视频分割传输教程,微信不支持1G文件以上

如下是一个2.77g的文件分割教程 . 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑&#xff0c;是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FF…...

interfaceResidue:一款用于分析蛋白复合物“接触界面残基”的pymol插件

当我们使用AF3或其他结构预测工具获得蛋白复合物后&#xff0c;逃不掉的一步就是分析接触界面的残基互作&#xff0c;而分析互作的前提是要准确地识别出接触界面上的残基有哪些&#xff0c;如果手动找则太耗费精力而且也容易遗漏。本期向大家安利的这样一款pymol插件&#xff0…...

【Qt】常用控件【按钮类】

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; 前言 二&#xff1a;&#x1f525; 按钮类控件 &#x1f98b; Push Button 按钮&#x1f380; 带有图标的按钮 -- 纯代码实现&#x1f380; 带有快捷键的按钮…...

996引擎-源码学习:PureMVC Lua 中的系统启动,初始化并注册 Mediator

996引擎-源码学习:PureMVC Lua 中的系统启动,初始化并注册 Mediator 一、PureMVC 核心架构二、系统启动流程系统启动注册 StartUp 通知发送 StartUp 通知,开始初始化三、Mediator 初始化1. gameStateInit.lua2. LoadingBeginCommand.lua3. RegisterWorldMediatorCommand.lua…...

SDP(一)

SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明&#xff1a;SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明&#xff1a;发起者/创建者 会话ID&#xff0c;那么该I…...

深入理解Apache Kafka

引言 在现代分布式系统架构中&#xff0c;中间件扮演着至关重要的角色&#xff0c;它作为系统各组件之间的桥梁&#xff0c;负责处理数据传递、消息通信、负载均衡等关键任务。在众多中间件解决方案中&#xff0c;Apache Kafka凭借其高吞吐量、低延迟和可扩展性&#xff0c;已…...

【AI News | 20250411】每日AI进展

AI Repos 1、docext docext是一款无需OCR的本地化文档信息提取工具&#xff0c;利用视觉语言模型&#xff08;VLM&#xff09;从发票、护照等文档图像中高效提取结构化字段和表格数据。其支持自定义字段或预置模板&#xff0c;提供置信度评分、多页处理及REST API集成&#xf…...

风暴之眼:在AI重构的数字世界重绘职业坐标系

硅谷的某个深夜&#xff0c;GitHub Copilot在程序员的注视下自动生成出完美代码&#xff0c;这个场景正在全球数百万开发者的屏幕上同步上演。当AI生成的代码通过图灵测试&#xff0c;当机器学习模型开始理解业务需求&#xff0c;一个根本性命题浮出水面&#xff1a;在人类亲手…...

关于深度学习局部视野与全局视野的一些思考

关于深度学习局部视野与全局视野的一些思考 最近&#xff0c;我在学习一个基于Transformer的网络模型时&#xff0c;注意到了一些局部特征和全局特征的概念。引发了一些疑问: 为什么说CNN只能看到局部区域&#xff0c;而transformer能看到全局区域?什么是token? 对于图像中…...

Asp.NET Core WebApi 配置文件

在 ASP.NET Core Web API 中&#xff0c;配置文件&#xff08;如 appsettings.json&#xff09;是管理应用程序设置的核心部分。ASP.NET Core 提供了一套灵活的配置系统&#xff0c;允许开发者从多种来源加载配置数据&#xff0c;并根据需要使用这些配置。 以下是关于如何在 A…...

免费的AI原创文章批量生成工具,站长内容更新工具推荐

说到AI生成文章&#xff0c;现在已经不是什么热门话题了&#xff0c;因为国内有很多的AI模型现在也越来越成熟了&#xff0c;那么科技工具的出现就是为人民服务的&#xff0c;我们要合理的用好它。 今天给大家推荐的是一款很厉害的站长网站内容更新工具&#xff0c;它可以利用…...

在ASP.NET Core 中实现幂等API和WinForms客户端防重提交实践

前言 大家好&#xff0c;欢迎关注dotnet研习社。今天&#xff0c;我想和大家聊聊在 ASP.NET Core 中如何实现幂等 API&#xff0c;这是我们在实际项目开发中非常重要、但又常常被忽略的一个话题。 什么是幂等性&#xff1f; 幂等性&#xff08;Idempotency&#xff09;指的是…...

Vue如何利用Postman和Axios制作小米商城购物车

小编最近太忙了&#xff0c;没来得及更新博客&#xff01;上一条博客我们写了小米商城购物车的简版&#xff0c;今天我们就在简版的基础之上来增加一些功能&#xff0c;写一下数量的加减、总价、删除&#xff08;批量删除&#xff09;、全选取消全选等功能。如果上一条博客没有…...

使用Windows工具进行内存取证(不进行完全内存转储)

内存取证是分析易失性内存以发现恶意活动、恶意软件行为或系统异常的强大技术。一般情况下调查员会转储全部物理内存&#xff0c;并使用Volatility等工具对其进行分析。然而在许多实际场景中&#xff0c;由于系统限制、安全策略或紧迫性等原因&#xff0c;完全转储可能并不可行…...

大厂文章阅读

1.异步任务处理系统&#xff0c;如何解决业务长耗时、高并发难题&#xff1f; 1)任务失败如何处理(CAS失败也可用)&#xff1a;1.指数退避,匹配下游任务执行系统的处理能力。比如收到下游任务执行系统的流控错误&#xff0c;或者感知到任务执行成为瓶颈&#xff0c;需要指数退…...

ubuntu 服务器版本常见问题

一、系统安装与初始化 1. 安装过程中断或失败 原因:镜像损坏、硬件兼容性、磁盘分区错误。 解决: 验证 ISO 文件的完整性(计算 SHA256 校验和)。 检查 BIOS/UEFI 设置(禁用 Secure Boot)。 使用手动分区模式,确保根分区(/)和 EFI 分区(如有)正确配置。 2. 系…...

第十五届蓝桥杯大赛软件赛省赛Python 大学 B 组试做(下)【本期题单: 缴纳过路费, 纯职业小组】

本期题单&#xff1a;缴纳过路费&#xff0c;纯职业小队 文章目录 缴纳过路费题目思路分析代码 纯职业小组题目思路分析 感谢大伙观看&#xff0c;别忘了三连支持一下大家也可以关注一下我的其它专栏&#xff0c;同样精彩喔~下期见咯~ 缴纳过路费 题目 题目链接&#xff1a;缴…...

【Hadoop入门】Hadoop生态之Oozie简介

1 什么是Oozie&#xff1f; Oozie是Apache基金会下的一个开源工作流调度系统&#xff0c;专门设计用于管理Hadoop作业。作为一个基于工作流的调度服务器&#xff0c;它能够在复杂的任务依赖关系中协调Hadoop MapReduce、Pig、Hive等任务的执行&#xff0c;是大数据平台中任务编…...

【Amazon EC2】为何基于浏览器的EC2 Instance Connect 客户端连接不上EC2实例

文章目录 前言&#x1f4d6;一、报错先知❌二、问题复现&#x1f62f;三、解决办法&#x1f3b2;四、验证结果&#x1f44d;五、参考链接&#x1f517; 前言&#x1f4d6; 这篇文章将讲述我在 Amazon EC2 上使用 RHEL9 AMI 时无法连接到 EC2 实例时所遇到的麻烦&#x1f616; …...

【大模型系列篇】最强检索增强技术GraphRAG基本原理详解

GraphRAG是一种结合了知识图谱&#xff08;Knowledge Graph&#xff09;和大型语言模型&#xff08;Large Language Model, LLM&#xff09;的检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术。它通过引入图结构化的知识表示和处理方法&#xff…...

【高阶数据结构】第二弹---图的深度解析:从基本概念到邻接矩阵的存储与操作

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【高阶数据结构】 目录 1、图的基本概念 2、图的存储结构 2.1、邻接矩阵 2.1.1、基本结构 2.1.2、图的创建 2.1.3、获取顶点下标…...

【Java实战】——手撕斐波那契数列

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 这里写目录标题 1.什么是斐波那契数列&#xff1f;2.代码实现2.1 递归实现2.2 迭代实现 3.执行结果 …...

Python数据可视化-第7章-绘制3D图表和统计地图

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第7章 绘制3D图表和统计地图 本章首先介绍了使用mplot3d工具包绘制3D图表&#xff0c;然后介绍了使用animation模块制作动画&#…...

操作系统 4.2-键盘

键盘中断初始化和处理 提取的代码如下&#xff1a; // con_init 函数&#xff0c;初始化控制台&#xff08;包括键盘&#xff09;的中断 void con_init(void) {set_trap_gate(0x21, &keyboard_interrupt); } ​ // 键盘中断处理函数 .globl _keyboard_interrupt _keyboard…...

24.0.2 双系统ubuntu 安装显卡驱动黑屏,系统启动界面键盘失灵

问题描述&#xff1a;通过run文件在ubuntu 界面版安装nvidia 驱动后&#xff0c;忽然黑屏&#xff0c;再次启动时&#xff0c;键盘鼠标失灵无法选择系统&#xff0c;只能进入ubuntu界面。第二个问题是ubuntu 也无法用户登录&#xff0c;左上角光标闪烁。 查询方案&#xff0c;…...

探索多领域免费API资源库:打造数据查询利器

在当今信息爆炸的时代&#xff0c;获取各种领域的数据已成为许多人的需求。而免费API资源库的出现为我们提供了便捷的途径&#xff0c;让我们可以轻松地获取所需数据。本文将介绍涵盖20领域的免费API资源库&#xff0c;通过代码示例展示其功能&#xff0c;帮助读者更好地理解和…...

jenkins项目发布-安装k8s(rancher)客户端kubectl

找一台Linux 上安装 kubectl 以下是通过国内镜像源快速安装 kubectl 的方法&#xff0c;适合国内网络环境。 1. 下载 kubectl 通过国内镜像源下载指定版本的 kubectl&#xff1a; 使用阿里云镜像源下载&#xff1a; curl -LO "https://dl.k8s.io/release/$(curl -L -…...

【2025年认证杯数学中国数学建模网络挑战赛】C题 数据预处理与问题一二求解

目录 2025认证杯网络挑战赛A题 数据预处理与问题一求解三、数据预处理及分析3.1 数据可视化3.2 滑动窗口相关系数统计与动态置信区间耦合分析模型3.3 耦合关系分析结果 四、问题一代码数据预处理问题一 2025认证杯网络挑战赛 A题 数据预处理与问题一求解 三、数据预处理及分析…...

天玑AI开发套件2.0模型库数量激增3.3倍,让AI开发选择更自由

AI终端能力的升级&#xff0c;从不止步于硬件性能的提升&#xff0c;更有赖于软硬一体的系统化能力建设。在MDDC 2025大会上&#xff0c;联发科整合发布AI游戏两大核心场景下的开发平台&#xff1a;Neuron Studio打通模型开发全流程&#xff1b;Dimensity Profiler从多个维度提…...

edge 更新到135后,Clash 打开后,正常网页也会自动跳转

发现了一个有意思的问题&#xff1a;edge 更新135后&#xff0c;以前正常使用的clash出现了打开deepseek也会自动跳转&#xff1a; Search Resultshttps://zurefy.com/zu1.php#gsc.tab0&gsc.qdeepseek &#xff0c;也就是不需要梯子的网站打不开了&#xff0c;需要的一直正…...

Socket多路复用网络编程应用总结

Socket多路复用网络编程应用总结 概述 • 传统I/O模型的局限性&#xff1a;传统阻塞式I/O模型每次仅在一个文件描述符&#xff08;File Descriptor, FD&#xff09;上执行I/O操作&#xff0c;导致程序需等待单个操作完成&#xff0c;无法高效处理多连接场景&#xff08;如高并…...

APT攻击阶段划分,每个阶段分区方法

根据现有资料&#xff0c;APT&#xff08;高级持续性威胁&#xff09;攻击的阶段划分主要基于两种主流模型&#xff1a;洛克希德-马丁的杀伤链模型和生命周期模型。以下是分阶段详解及分区依据&#xff1a; 一、洛克希德-马丁杀伤链模型&#xff08;7阶段&#xff09; 核心逻辑…...

图像颜色空间对比(Opencv)

1. 颜色转换 import cv2 import matplotlib.pyplot as plotimg cv2.imread("tmp.jpg") img_r cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_g cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_h cv2.cvtColor(img, cv2.COLOR_BGR2HSV) img_l cv2.cvtColor(img, cv2.C…...

【NLP 58、利用trl框架训练LLM】

孤独总比忍受傻逼好得多 —— 25.4.11 源代码网页&#xff1a; 项目文件预览 - trl:Train transformer language models with reinforcement learning. - GitCode TRL —— 变压器强化学习 trl&#xff1a;一个用于后训练基础模型的全面库 1.概述 TRL 是一个利用监督微调&a…...

数据仓库元数据的管理

元数据&#xff08;Meta Date&#xff09;&#xff0c;主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态 及ETL的任务运行状态。一般会通过元数据资料库&#xff08;Metadata Repository&#xff09;来统一地存储和管理元数据&#xff0c;其主要 目的…...

MySQL逻辑架构有什么?

1. MySQL逻辑架构分层 MySQL的逻辑架构可分为三层&#xff08;自上而下&#xff09;&#xff1a; 连接层&#xff08;Client Layer&#xff09;服务层&#xff08;Server Layer&#xff09;存储引擎层&#xff08;Storage Engine Layer&#xff09; -----------------------…...

蓝桥杯 web 常用到的一些知识点

reduce 方法遍历数组、将数组元素累计 ①reduce接收两个参数&#xff0c;一个回调函数&#xff0c;一个初始值 ②回调函数传递了两个参数&#xff0c;一个是累加值&#xff0c;另一个是当前值 reduce的写法&#xff1a; arrays.reduce(&#xff08;a&#xff0c;c&#xff…...

构建高可靠C++服务框架:从日志系统到任务调度器的完整实现

构建高可靠C服务框架&#xff1a;从日志系统到任务调度器的完整实现 一、深度解析示例代码技术体系 1.1 日志系统的进阶应用 示例代码中的ZRY_LOG_XXX宏展示了基础日志功能&#xff0c;但在生产环境中我们需要更完善的日志系统&#xff1a; 推荐技术栈组合&#xff1a; sp…...

<C#>在 C# .NET 中,使用 LoggerExtensions方法创建日志

在 C# .NET 中&#xff0c;LoggerExtensions 是 Microsoft.Extensions.Logging 命名空间下的一组扩展方法&#xff0c;它们为 ILogger 接口提供了便捷的日志记录方式。借助这些扩展方法&#xff0c;你能轻松记录不同级别的日志&#xff0c;如调试信息、信息、警告、错误等。下面…...

微服务与Spring Cloud Alibaba简介

微服务&#xff08;或微服务架构&#xff09;是一种云原生架构方法&#xff0c;其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。本单元主要介绍微服务架构的定义、微服务的特征、微服务架构面临的挑战、Spring Cloud 定义、Spring Cloud 核心组件、Spring C…...

元生代品牌建设:平台实现工作流(comfyui)创建与技术文档说明

本文摘要&#xff1a;蓝耘科技自2004年成立以来&#xff0c;从传统IT系统集成业务转型为聚焦GPU算力云服务的科技公司。其发布的元生代平台&#xff0c;是一个集算力调度、应用市场和AI协作开发为一体的智算云平台。用户可在蓝耘平台使用ComfyUI进行AI绘图&#xff0c;通过添加…...