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

多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)

常见的线程类型包括用户线程(User Threads)、守护线程(Daemon Threads)、主线程(Main Thread)、工作线程(Worker Threads)和线程池中的线程。

一、用户线程(User Threads)

特点:

  • 用户线程是普通的Java线程,通常由程序员显式创建。
  • 用户线程在程序运行期间一直存在,直到它们完成任务或程序终止。

代码示例:

public class UserThreadExample {public static void main(String[] args) {Thread userThread = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("User thread running: " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});userThread.start();}
}

2、守护线程(Daemon Threads)

特点:

  • 守护线程是在后台运行的线程,它们通常用于为其他线程提供服务。
  • 当所有用户线程都结束时,JVM会自动终止守护线程并退出。(即使守护线程没有执行完任务,也会被JVM强制退出,所以主要业务一定不能放在守护线程中执行)
  • 守护线程通常用于执行一些辅助任务,如垃圾回收、日志记录等。

代码示例:

public class DaemonThreadExample {public static void main(String[] args) {Thread daemonThread = new Thread(() -> {while (true) {System.out.println("Daemon thread running...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});daemonThread.setDaemon(true);  // 设置为守护线程,就这一句就够了daemonThread.start();// 主线程休眠一段时间后结束try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}
}

解释:

  • 创建一个新的线程daemonThread,并将其设置为守护线程。
  • 守护线程无限循环运行,每秒打印一条消息。
  • 主线程休眠5秒后结束,此时JVM会自动终止,守护线程也会被终止。

3、主线程(Main Thread)

特点:

  • 主线程是每个Java应用程序的入口点,它是JVM在启动时自动创建的第一个线程。
  • 主线程负责执行main方法中的代码。
  • 当主线程结束时,如果还有其他用户线程在运行,JVM会继续运行这些线程。

代码示例:

public class MainThreadExample {public static void main(String[] args) {System.out.println("Main thread started");Thread userThread = new Thread(() -> {System.out.println("User thread running...");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}});userThread.start();  // 用户线程启动,实际上就是主线程干的事情System.out.println("Main thread ending");}
}

解释:

  • 主线程执行main方法中的代码。
  • 创建并启动一个用户线程userThread。
  • 主线程在启动用户线程后继续执行打印,之后就结束了。
  • 用户线程会继续运行,直到完成任务。

4、工作线程(Worker Threads)

特点:

  • 工作线程通常用于执行具体的任务,它们可以是用户线程或守护线程。
  • 工作线程通常由线程池管理,用于处理任务队列中的任务。
  • 工作线程可以提高应用程序的并发性和性能。

代码示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class WorkerThreadExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);  // 创建固定大小的线程池for (int i = 0; i < 5; i++) {int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});}executor.shutdown();  // 关闭线程池}
}

解释:

  • 创建一个固定大小为2的线程池executor。
  • 提交5个任务到线程池,每个任务在执行时会打印任务ID和当前线程名称。
  • 调用shutdown方法关闭线程池,等待所有任务完成。

5、线程池中的线程

特点:

  • 线程池中的线程是由线程池管理的,它们可以重复使用,减少了创建和销毁线程的开销。
  • 线程池可以控制并发线程的数量,避免过多的线程消耗系统资源。
  • 线程池通常用于处理大量的短期任务。

代码示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newCachedThreadPool();  // 创建可缓存线程池for (int i = 0; i < 10; i++) {int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});}executor.shutdown();  // 关闭线程池}
}

解释:

  • 创建一个可缓存线程池executor,它会根据需要创建新的线程。
  • 提交10个任务到线程池,每个任务在执行时会打印任务ID和当前线程名称。
  • 调用shutdown方法关闭线程池,等待所有任务完成。

6、线程分类总结

(1)、用户线程:普通的Java线程,由程序员显式创建。
(2)、守护线程:后台线程,用于提供服务,当所有用户线程结束时自动终止。
(3)、主线程:JVM自动创建的第一个线程,执行main方法中的代码。
(4)、工作线程:用于执行具体任务的线程,通常由线程池管理。
(5)、线程池中的线程:由线程池管理的线程,可以重复使用,减少开销。

7、springboot常见线程类型

(1)、主线程(Main Thread)

1、概述

  • 这是Spring Boot应用启动时由JVM创建的第一个线程。
  • 主线程负责启动Spring Boot应用,加载配置,初始化Spring容器等。

2、创建时机

  • 应用启动时,由JVM自动创建。

代码示例

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

(2)、Tomcat/NIO线程(接受客户端请求用)

1、概述

  • 如果你的Spring Boot应用使用了嵌入式的Tomcat服务器,Tomcat会创建多个线程来处理HTTP请求。
  • 这些线程通常是NIO线程(非阻塞线程,可异步),负责接收客户端请求并处理响应。

2、创建时机

  • 当Spring Boot应用启动并初始化嵌入式Tomcat服务器时。

配置文件示例
无需编码,仅配置即可,不配置也可以会有默认配置。

server:port: 8080tomcat:max-threads: 200  # 最大线程数min-spare-threads: 10  # 最小空闲线程数

(3)、定时任务线程(Scheduled Tasks)

1、概述

  • 如果你在Spring Boot应用中使用了定时任务(如@Scheduled注解),Spring Boot会创建一个或多个线程来执行这些定时任务。
  • 这些线程通常由TaskScheduler管理。

2、创建时机

  • 当Spring Boot应用启动并初始化定时任务时。

代码示例

@Configuration
@EnableScheduling
public class SchedulerConfig {
}@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000)   // 自动创建定时任务线程监听并执行public void performTask() {System.out.println("Executing scheduled task at " + LocalDateTime.now());}
}

(4)、异步任务线程(Async Tasks)

1、概述

  • 如果你在Spring Boot应用中使用了异步方法(如@Async注解),Spring Boot会创建一个或多个线程来执行这些异步任务。
  • 这些线程通常由TaskExecutor管理。

这个在附录中在详细说明。

(5)、自定义线程

1、概述

  • 你可以在Spring Boot应用中手动创建和管理线程,例如通过实现Runnable接口或继承Thread类。

2、创建时机

  • 在你需要的时候手动创建。

代码示例

@Component
public class CustomThreadExample {@PostConstructpublic void startCustomThread() {Thread customThread = new Thread(() -> {while (true) {System.out.println("Custom thread running at " + LocalDateTime.now());try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}});customThread.start();}
}

附录:

异步任务线程(Async Tasks)

1、概述

  • 如果你在Spring Boot应用中使用了异步方法(如@Async注解),Spring Boot会创建一个或多个线程来执行这些异步任务,主线程不会阻塞会继续执行后面的代码。
  • 这些线程通常由TaskExecutor管理。
  • 使用异步任务,使用@EnableAsync开启后(主方法等配置入口),在需要的方法上添加@Async注解即可。
2、异步任务线程的作用
(1)、提高响应性
  • 异步任务线程可以在后台执行耗时的操作,而不阻塞主线程或请求处理线程。这样,主线程可以继续处理其他请求,提高系统的整体响应性。
(2)、优化资源利用
  • 对于耗时较长的任务,如果使用同步方式处理,可能会占用宝贵的线程资源,导致其他任务无法及时处理。异步任务线程可以将这些任务移到后台执行,释放主线程资源。
(3)、并发处理
  • 异步任务线程可以并行处理多个任务,提高系统的并发处理能力。这对于需要处理大量并发请求的应用尤其重要。
3、异步任务特点

(1)、异步任务线程:异步任务在单独的线程中执行,不会阻塞主线程。
(2)、立即返回:异步方法调用会立即返回一个CompletableFuture对象,主线程可以继续执行其他任务。
(3)、回调机制:使用thenAccept等方法注册回调函数,这些回调函数在异步任务完成时被调用(被线程池的其他线程调用),不会阻塞主线程。

4、常见的异步任务场景

(1)、邮件发送

  • 发送邮件是一个耗时操作,通常需要几秒钟甚至更长时间。使用异步任务线程可以在后台发送邮件,而不会阻塞主线程。

(2)、文件上传和下载

  • 文件上传和下载操作通常涉及大量的I/O操作,使用异步任务线程可以避免阻塞主线程,提高系统的响应性。

(3)、数据处理和计算

  • 对于复杂的数据处理和计算任务,使用异步任务线程可以将这些任务移到后台执行,释放主线程资源。

(4)日志记录

  • 日志记录操作通常需要写入磁盘,使用异步任务线程可以避免阻塞主线程,提高系统的性能。
5、异步任务线程与异步请求处理的区别

前者是优化请求响应速度,把不重要或耗时的事情放在后台慢慢执行,主线程可以继续干其他事情或直接返回的一种处理方式;后者是并行可同时接受客户端的多个请求,两者完全不是一回事,需要注意下。

(1)、异步任务线程
  • 用于处理耗时较长的后台任务。
  • 通常由开发人员手动创建和管理。
  • 使用@Async注解和TaskExecutor来实现。
    即:用于处理耗时较长的后台任务,提高系统的响应性和并发处理能力。
(2)、异步请求处理
  • 用于处理HTTP请求的异步响应。
  • 通常由Web框架(如Spring MVC,springboot)自动支持。
  • 使用CompletableFuture、DeferredResult等异步API来实现。
    即:用于处理HTTP请求的异步响应,通常由Web框架自动支持。
6、如何使用异步任务
(1)、@EnableAsync

@EnableAsync注解只需要在一个配置类上启用一次,即可在整个应用程序中启用异步任务的支持。即:开启后会告诉Spring框架扫描并管理带有@Async注解的方法。

代码示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;@Configuration
@EnableAsync
public class AsyncConfig {// 配置类可以包含其他Bean和配置
}
(2)、@Async

1、@Async注解用于标记那些需要异步执行的方法上。注意,方法必须在一个Spring管理的Bean中,否则不会扫描到。
2、@Async标记的方法将在异步任务线程中执行,不会阻塞当前线程,而是立即返回一个Future对象或CompletableFuture对象。(这个Future对象现在是无法获取结果的,只能通过定义回调的方式用于异步任务完成后再去通知调用的线程,当然如果无需等待结果的也可以直接忽略返回结果)。

(3)、异步线程池

默认情况下,Spring是使用一个简单的线程池来执行异步任务。你也可以自定义线程池注入spring容器中,以更好地控制异步任务的执行。

3.1、自定义线程池示例

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@EnableAsync       // 开启异步任务
public class AsyncConfig {@Bean                      // 注入线程池public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(5);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Async-");executor.initialize();return executor;}
}

3.2、控制器示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/send-email")public String sendEmail(@RequestParam String recipient, @RequestParam String message) {// 调用异步方法CompletableFuture<String> result = asyncService.sendEmail(recipient, message);// 处理异步结果result.thenAccept(response -> {   // 定义的回调方法,不会阻塞主线程,主线程会定义完成之后直接跳过该方法,往后执行。在异步任务完成后,真正执行回调方法代码的是线程池中的线程。System.out.println("Response: " + response);   // 异步任务完成后,由线程池中的线程执行,主线程不会执行。});return "Request accepted, email will be sent asynchronously";}
}

3.3、异步方法

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;@Service
public class AsyncService {@Asyncpublic CompletableFuture<String> sendEmail(String recipient, String message) {// 模拟耗时操作try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}// 发送邮件System.out.println("Email sent to " + recipient + ": " + message);return CompletableFuture.completedFuture("Email sent successfully");}
}

解释一下:
1、异步方法的调用:

  • AsyncControllersendEmail方法中,调用asyncService.sendEmail方法。
  • sendEmail方法被标记为@Async,因此它会在一个异步任务线程中执行。
  • 方法调用会立即返回一个CompletableFuture<String>对象,标识异步任务的结果对象。(这个对象现在是无法获取执行结果的,因为还没有执行完成,需要想要调用线程得到响应,可以通过定义回调的方式在异步任务完成后再通知调用的线程)。
    2、处理异步结果:
  • 使用result.thenAccept(response -> { ... })方法来处理异步任务的结果。
  • thenAccept方法注册一个回调函数,当异步任务完成时,回调函数会被调用,并传入任务的结果。
  • 这个回调函数在异步任务线程中执行,不会阻塞主线程。
    3、立即返回响应:
  • AsyncControllersendEmail方法在调用异步方法后立即返回一个字符串"Request accepted, email will be sent asynchronously"
  • 这个响应告诉客户端请求已经被接受,邮件将在后台异步发送。

学海无涯苦作舟!!!

相关文章:

多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)

常见的线程类型包括用户线程&#xff08;User Threads&#xff09;、守护线程&#xff08;Daemon Threads&#xff09;、主线程&#xff08;Main Thread&#xff09;、工作线程&#xff08;Worker Threads&#xff09;和线程池中的线程。 一、用户线程&#xff08;User Thread…...

详解高斯消元

详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉&#xff0c;出现新的请求结果&#xff0c;参数start更新&#xff0c;每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...

泷羽sec- shell编程(8) until循环以及函数基本创建调用 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计题

使用Apache Flink从Kafka中消费商品数据&#xff0c;并进行商品分类的数量统计是一个典型的流处理任务。以下是一个详细的步骤指南和示例代码&#xff0c;帮助你实现这一功能。 ### 前提条件 1. **安装Flink**&#xff1a;确保你的环境中已经安装了 Apache Flink。 2. **安装…...

Ubuntu 安装 MariaDB

安装 MariaDB具体步骤 1、更新软件包索引&#xff1a; sudo apt update2、安装 MariaDB 服务器&#xff1a; sudo apt install mariadb-server3、启动 MariaDB 服务&#xff08;如果未自动启动&#xff09;&#xff1a; sudo systemctl start mariadb4、设置 MariaDB 开机启…...

GPT打字机效果—— fetchEventSouce进行sse流式请求

EventStream基本用法 与 WebSocket 不同的是&#xff0c;服务器发送事件是单向的。数据消息只能从服务端到发送到客户端&#xff08;如用户的浏览器&#xff09;。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…...

Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II

Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路2. 代码实现 题目链接&#xff1a;3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路 这一题和前一题Leetcode 3372其实整体思路上并没有啥太大…...

JS的魔法三角:constructor、prototype与__proto__

在JavaScript中&#xff0c;constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角&#xff1a; 1. constructor 定义&#xff1a;constructor是一个函数&am…...

用c语言完成俄罗斯方块小游戏

用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发&#xff0c;怎么说呢&#xff0c;在这里只针对刚学程序设计的学生&#xff0c;就是说刚接触C语言没多久&#xff0c;有一点功底的学生看看&#xff0c;简陋的代码&#xff0c;简陋的实现&#xff0…...

Leetcode打卡:N皇后

执行结果&#xff1a;通过 题目&#xff1a;51 N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...

位运算在嵌入式系统开发中的应用

目录 一、数据存储与节省 “绝技” 1.1. 传感器数据存储挑战 1.2. 位运算解决方案 1.2.1. 数据整合 1.2.2. 数据提取 1.3. 收益分析 二、硬件控制 “精准操纵术” 2.1. 位运算操控硬件寄存器的实例 2.2. 位运算在硬件控制中的优势 2.3. 电机驱动芯片寄存器控制示例 …...

livekit 服务部署

本地起 1. 拉取生成文件镜像 sudo docker pull livekit/generate 2. 生成配置文件 sudo docker run --rm -v $PWD:/output livekit/generate --local (记住输出信息) 3. 拉取livekit/livekit-server sudo docker pull livekit/livekit-server 4. 开始运行服务 sudo docker run…...

笔记:visual studio2022编译 和 运行 VTK9.4.0

一、下载源码 VTK官网下载对应源码。 Download | VTKhttps://vtk.org/download/ 二、编译动态库&#xff08;基于Win11 24h&#xff09; 1. 用VS打开VTK源码的CMakeLists.txt&#xff0c;等待项目配置完成。 生成完毕如图 2.生成动态库&#xff0c;点击全部生成&#xff0c…...

【Linux | 计网】TCP协议深度解析:从连接管理到流量控制与滑动窗口

目录 前言&#xff1a; 1、三次握手和四次挥手的联系&#xff1a; 为什么挥手必须要将ACK和FIN分开呢&#xff1f; 2.理解 CLOSE_WAIT 状态 CLOSE_WAIT状态的特点 3.FIN_WAIT状态讲解 3.1、FIN_WAIT_1状态 3.2、FIN_WAIT_2状态 3.3、FIN_WAIT状态的作用与意义 4.理解…...

Qt Sensors 传感器控制介绍篇

文章目录 Qt Sensors 模块介绍前言 什么是 Qt Sensors&#xff1f;主要特点&#xff1a; 支持的传感器类型Qt Sensors 的核心组件应用场景优势总结 Qt Sensors 模块介绍 前言 随着现代硬件设备的不断发展&#xff0c;传感器已成为许多设备&#xff08;如智能手机、平板电脑和…...

探索3D世界:使用 lib3ds 读取和解析 3DS 文件

在3D图形开发中&#xff0c;读取和解析3DS文件是创建和渲染3D场景的第一步。3DS&#xff08;3D Studio&#xff09;文件格式是一种广泛使用的3D模型文件格式&#xff0c;它包含了多种类型的数据&#xff0c;用于描述3D场景中的物体、材质、相机、灯光和动画等。lib3ds 是一个开…...

【开源免费】基于SpringBoot+Vue.JS服装生产管理系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

计算机技术:冯·诺伊曼架构

冯诺伊曼架构&#xff08;Von Neumann Architecture&#xff09;是由著名数学家和计算机科学家约翰冯诺伊曼&#xff08;John von Neumann&#xff09;在20世纪40年代提出的一种计算机设计模型。它奠定了现代通用计算机设计的基础。 1. 核心思想 冯诺伊曼架构的核心思想是存储…...

在Window10或11系统中同时安装 JDK8 和 JDK11

在Window10或11系统中同时安装 JDK8 和 JDK11 最近写项目&#xff0c;之前的项目是用Java8环境开发的&#xff0c;在二次迭代中&#xff0c;但是新开发的项目采用Java11环境来开发&#xff0c;所以需要同时安装JDK8和JDK11环境&#xff0c;但是两个环境是不能同时使用的&#…...

Hbase2.2.7集群部署

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为Hbase主节点&#xff09;、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0&#xff0c;zookeeper版本为3.5.8 下载安装包 下载链接&#xff1a;In…...

Java学习,数据结构

Java 提供了丰富的数据结构来处理和组织数据&#xff0c;Java的 java.util 包中提供了许多这些数据结构的实现&#xff0c;可以根据需要选择合适的类。 List&#xff08;列表&#xff09; ArrayList&#xff1a;基于动态数组的数据结构&#xff0c;允许包含重复元素和 null。 …...

微众银行前端面试题及参考答案

使用的协议是 HTTP 还是 HTTPS&#xff0c;为什么没用 HTTPS&#xff1f; 在前端开发中&#xff0c;有些网站使用 HTTP 协议&#xff0c;有些使用 HTTPS 协议。 使用 HTTP 协议的情况可能是因为网站对安全性的要求不是极高&#xff0c;或者处于开发的早期阶段&#xff0c;还没有…...

spark同步mysql数据到sqlserver

使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL&#xff08;Extract, Transform, Load&#xff09;任务。这里提供一个基本的步骤指南&#xff0c;以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**&#xff1a;确保你的环境中已经安装了…...

使用 useMemo 和 React.memo 优化 React 组件渲染

在 React 中&#xff0c;性能优化是一个重要的主题&#xff0c;特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件&#xff0c;包含两个子组件&#xff1a; MemoChild&#xff1a;使用 R…...

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…...

Bert+CRF的NER实战

CRF&#xff08;条件随机场-Conditional Random Field&#xff09; 原始本文&#xff1a;我在北京吃炸酱面 标注示例&#xff1a; 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF&#xff1a; 目的&#xff1a;提出一些不可能出现的预测组合&#xff08;例如I-PLA不能…...

python学习笔记8-函数2

参数传递 传不可变对象 & 传可变对象 def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a [343] func(a)def func(b):b.appe…...

【linux学习指南】详解Linux进程信号保存

文章目录 &#x1f4dd;保存信号&#x1f320; 信号其他相关常⻅概念&#x1f309;在内核中的表⽰ &#x1f320; sigset_t&#x1f320;信号集操作函数&#x1f309;sigprocmask&#x1f309;sigpending &#x1f6a9;总结 &#x1f4dd;保存信号 &#x1f320; 信号其他相关常…...

Postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这…...

ORACLE之DBA常用数据库查询

数据库信息 数据库概要select a.name "DB Name", e.global_name "Global Name", c.host_name "Host Name", c.instance_name "Instance Name" , DECODE(c.logins,RESTRICTED,YES,NO) "Restricted Mo…...

C++之C++11新特性(三)--- 智能指针

目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…...

12 设计模式之工厂方法模式

一、什么是工厂方法模式&#xff1f; 1.定义 在软件开发中&#xff0c;设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 作为创建型设计模式之一&#xff0c;常常被用来解决对象创建问题。它通过将对象的创建交给…...

Python 自动化办公的 10 大脚本

大家好&#xff0c;我是你们的 Python 讲师&#xff01;今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作&#xff0c;提高效率。无论是处理 Excel 文件、发送邮件&#xff0c;还是自动化网页操作&#xff0c;Python 都能派上用场。 1. 批量…...

十一、快速入门go语言之接口和反射

文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 &#x1f4c5; 2024年5月9日 &#x1f4e6; 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中&#xff0c;字符串是最常用的数据类型之一。字符串用于表示文本数据&#xff0c;而正则表达式则是一种强大的工具&#xff0c;用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

力扣刷题TOP101:8.BM10 两个链表的第一个公共结点

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 两个无环的单向链表&#xff0c;它们的第一个公共结点{{6,7}。 思路 这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏&#xff0c;实际上背地里都偷…...

⽂件操作详解

⽬录 一 文件操作的引入 1 为什么使⽤⽂件&#xff1f; 2 什么是⽂件&#xff1f; 3 文件分类&#xff08;1 从⽂件功能的⻆度来分类&#xff1a;程序⽂件/数据⽂件 2根据数据的组织形式&#xff1a;为⽂本⽂件/⼆进制⽂件&#xff09; 二 ⽂件的打开和关闭 1 …...

UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e

近日&#xff0c;优傲&#xff08;UR&#xff09;机器人公司立足中国市场需求&#xff0c;重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲&#xff08;UR&#xff09;一以贯之的高品质与性能特质&#xff0c;着重优化负载自重比&#xff0c;且在价格层面具竞争力&…...

PostgreSQL实现透视表查询

PostgreSQL 8.3版本发布时&#xff0c;引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数&#xff0c;用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…...

C#里怎么样使用Array.BinarySearch函数?

C#里怎么样使用Array.BinarySearch函数? 因为二分算法如此重要,所以要多加练习。 但是它的返回值,也有三种状态,导致很多人使用它的时候, 也感觉到迷惑的。 在这里的例子演示了三种返回值的使用: /** C# Program to Search an element with Array Indices*/ using …...

量化交易系统开发-实时行情自动化交易-8.5.VNPY平台

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于VNPY平台介绍。 VN.PY 是…...

分治算法中的主定理及其应用

引言 学习递归算法的时候&#xff0c;找到了用来计算算法复杂度的主定理。问大语言模型&#xff0c;发现回答的主定理描述有所不同。本文比较了两个不同版本中表述的差异。并给出一些例子用来计算分治递归类算法的复杂度。 主定理的不同版本 版本1 在《算法导论》第三版第四…...

前端的面试题

1.常用的块与行属性内标签有哪些&#xff1f;有什么特征&#xff1f; 块标签&#xff1a;div、h1~h6、ul、li、table、p、br、form。 特征&#xff1a;独占一行&#xff0c;换行显示&#xff0c;可以设置宽高&#xff0c;可以嵌套块和行 行标签&#xff1a;span、a、img、text…...

vue实现excel导出导入

文章目录 安装xlsx依赖和file-saver依赖Excel导出使用element-ui的el-table展示数据定义导出按钮将数据导出 excel导入定义文件导入显示框定义导入按钮解析选择的文件进行导入 安装xlsx依赖和file-saver依赖 npm install xlsx -S npm install file-saver -SExcel导出 使用ele…...

婚纱摄影管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】虚拟可复制品不支持退换货 【重要3⃣️】虚拟可复制品不支持退换货 【重要3⃣️】虚拟可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【…...

对拍详细使用方法

对拍的作用 对于我们在学校OJ&#xff0c;cf&#xff0c;牛客…各种只提供少量测试数据的题目&#xff0c;常常交上代码常常超时&#xff0c;能写出正确的暴力代码而题目要求的时间复杂度更低。然而这时你写出了能通过样例且时间复杂度更低的代码&#xff0c;但交上去就是错误…...

Flume 与 Kafka 整合实战

目录 一、Kafka 作为 Source【数据进入到kafka中&#xff0c;抽取出来】 &#xff08;一&#xff09;环境准备与配置文件创建 &#xff08;二&#xff09;创建主题 &#xff08;三&#xff09;测试步骤 二、Kafka 作为 Sink数据从别的地方抽取到kafka里面】 &#xff08;…...

Web开发技术栈选择指南

互联网时代的蓬勃发展&#xff0c;让越来越多人投身软件开发领域。面对前端和后端的选择&#xff0c;很多初学者往往陷入迷茫。让我们一起深入了解这两个领域的特点&#xff0c;帮助你做出最适合自己的选择。 在互联网发展的早期&#xff0c;前端开发主要负责页面布局和简单的…...

社群赋能电商:小程序 AI 智能名片与 S2B2C 商城系统的整合与突破

摘要&#xff1a;本文聚焦于社群在电商领域日益凸显的关键地位&#xff0c;深入探讨在社群粉丝经济迅猛发展背景下&#xff0c;小程序 AI 智能名片与 S2B2C 商城系统如何与社群深度融合&#xff0c;助力电商突破传统运营局限&#xff0c;挖掘新增长点。通过分析社群对电商的价值…...