Redis 7.x 系列【34】Spring Boot 集成

news2024/9/9 1:06:30

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 前言
    • 2. Spring Data Redis
    • 3. Spring Boot Data Redis Starter
      • 3.1 起步依赖
      • 3.2 自动配置
    • 4. 配置
      • 4.1 客户端类型
      • 4.2 连接池
      • 4.3 连接配置
        • 4.3.1 单机
        • 4.3.2 哨兵
        • 4.3.3 集群
      • 4.4 连接、读取超时
      • 4.5 SSL Bundle
      • 4.6 Redis Repository
      • 4.7 Lettuce 独有
    • 5. 入门案例
      • 5.1 引入依赖
      • 5.2 配置连接
      • 5.3 操作模板类

1. 前言

在使用客户端连接 Redis 时,例如 Jedis

        // 创建连接池
        JedisPool pool = new JedisPool("localhost", 6379,"default","123456");
        // 获取客户端
        try (Jedis jedis = pool.getResource()) {
            // 存入一个字符串
            jedis.set("foo", "bar");
        }

直接集成客户端,需要我们自己维护连接配置,获取客户端连接,再执行操作,最后还需要释放资源。Spring 提供了 Spring Data RedisSpring Boot Data Redis Starter ,在 Spring Boot 环境中,可以很方便的连接并操作 Redis

注意: 本篇主要是介绍在 Spring Boot 中如何配置连接 Redis,关于使用细节方面,请参考 Spring Data Redis 专栏

2. Spring Data Redis

官方文档

Spring Data Redis 用于简化 Redis 的配置和操作,提供了与存储进行交互的低级和高级抽象,从而使用户无需担心基础设施问题。

核心特性:

  • 连接:支持多个 Redis 客户端包(如 LettuceJedis ),提供低级抽象,简化了连接管理。
  • 异常转换:将 Redis 客户端异常转换为 Spring 的数据访问异常层次结构,便于异常处理。
  • RedisTemplate:提供了一个高级抽象,用于执行各种 Redis 操作,包括异常转换和序列化支持,简化了 Redis 操作。
  • 发布/订阅支持:如为消息驱动的 POJO 提供的 MessageListenerContainer ,支持发布/订阅模式。
  • Redis SentinelRedis Cluster 支持:提供对 Redis 的高可用性和集群配置的支持。
  • 响应式API:默认使用 Lettuce 提供响应式编程能力,支持非阻塞的异步操作。
  • 序列化器:包括JDKStringJSONSpring Object/XML映射序列化器,方便数据序列化和反序列化。
  • JDK集合实现:在Redis之上实现JDK集合,允许以分布式方式使用集合数据结构。
  • 原子计数器支持类:提供原子计数器类,支持分布式环境下的计数器操作。
  • 排序和管道功能:支持排序和管道化功能,提高数据处理效率。
  • SORTSORT/GET模式及返回批量值的专门支持:提供对Redis排序命令及其变体的深入支持。
  • Spring 3.1缓存抽象实现(Spring Cache):为Spring 3.1的缓存抽象提供 Redis 实现,支持缓存数据的存储和检索。
  • 仓库接口自动实现:包括使用 @EnableRedisRepositories 注解支持自定义查询方法的仓库接口自动实现,简化了数据访问层的开发。
  • CDI 支持:提供对依赖注入(CDI)的支持,便于在 Spring 应用中使用 CDI 方式管理仓库。

3. Spring Boot Data Redis Starter

Spring Data Redis 的基础上,提供了 Spring Boot 启动器:

  • spring-boot-starter-data-redis:适用传统应用程序
  • spring-boot-starter-data-redis-reactive:适用响应式应用程序

3.1 起步依赖

Spring Boot 中集成 Redis ,只需要引入以下依赖即可:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

spring-boot-starter-data-redis 中包含了 Lettuce 客户端和 Spring Data Redis ,无需再引入其他依赖:

在这里插入图片描述

3.2 自动配置

spring-boot-autoconfigure 包中,提供了 Redis 自动配置功能:

在这里插入图片描述

核心类介绍:

  • ClientResourcesBuilderCustomizer:客户端资源定制器,允许开发者对 Redis 连接进行细粒度的控制和优化。
  • JedisClientConfigurationBuilderCustomizerJedis 配置定制器,用于添加自定义的 Jedis 客户端配置。
  • LettuceClientConfigurationBuilderCustomizerLettuce 配置定制器,用于添加自定义的 Lettuce 客户端配置。
  • JedisConnectionConfigurationJedis 连接自动配置类
  • LettuceConnectionConfigurationLettuce 连接自动配置类
  • RedisAutoConfigurationRedis 自动配置类,主动注册 RedisTemplateStringRedisTemplate
  • RedisPropertiesRedis属性配置类,加载 application.yml 中的配置到应用环境中
  • RedisConnectionDetails:获取 Redis 连接信息
  • RedisReactiveAutoConfigurationReactive Redis 环境下的自动配置类,主动注册ReactiveRedisTemplateReactiveStringRedisTemplate
  • RedisRepositoriesAutoConfigurationRedis Repository 自动配置类,可以通过定义 Repository 接口操作 Redis
  • RedisUrlSyntaxFailureAnalyzerURL 语法错误分析器

4. 配置

Spring Boot Redis 官方配置说明

RedisProperties 提供了 RedisSpring Boot 环境中的所有配置项,配置前缀为 spring.data.redis

4.1 客户端类型

客户端类型对应的配置项为 spring.data.redis.client-type ,可配置项对应的类为 RedisProperties.ClientType

    public static enum ClientType {
        LETTUCE,
        JEDIS;
    }

默认为 LETTUCE ,并且 Spring Boot 起步依赖中也包含了该包,如果想要使用 JEDIS ,可以如下配置:

spring:
  data:
    redis:
      client-type: jedis
      # 设置连接到 Redis 时使用的客户端名称(自定义),可用于日志记录和监控目的
      client-name: spring-boot-redis

此外还需要额外引入 Jedis 客户端包:

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>5.1.2</version>
        </dependency>

4.2 连接池

连接池(Connection Pool)需要在具体的客户端下进行配置,例如 jedis 连接池:

spring:
  data:
    redis:
      client-type: jedis
      jedis:
        pool:
          enabled: true
          max-active: 8
          max-idle: 8
          max-wait: 10000
          min-idle: 0
          time-between-eviction-runs: 10000

例如 lettuce 连接池:

spring:
  data:
    redis:
      client-type: lettuce
      lettuce:
        pool:
          enabled: true
          max-active: 8
          max-idle: 8
          max-wait: 10000
          min-idle: 0
          time-between-eviction-runs: 10000

关于连接池的配置项说明如下:

  • enabled:是否启用连接池,设置为 true (默认)表示开启,推荐使用连接池。
  • max-active:连接池中最大活跃连接数,默认 8 。可以限制客户端同时占用的资源数量,避免过多的连接占用Redis 服务器资源或客户端资源。
  • max-idle:连接池中最大空闲连接数,默认 8
  • min-idle:连接池中最小空闲连接数,默认 0 (不会强制保持任何空闲连接)。
  • max-wait:当连接池中没有可用连接时,获取连接的最大等待时间(以毫秒为单位),默认 -1 (一直等待)。如果没有可用的连接,则尝试获取连接的操作将抛出异常。
  • timeBetweenEvictionRuns:空闲连接检测器两次运行之间的间隔时间(以毫秒为单位)。设置为 10 秒时,连接池将每 10 秒检查一次空闲连接,并根据需要关闭那些超过最大空闲时间限制的连接。以保持连接池的健康状态,避免因为长时间未使用的连接而占用资源。

4.3 连接配置

Spring Boot 默认支持三种部署方式的连接,都配置了的情况下,加载优先级为:集群 > 哨兵 > 单机。

4.3.1 单机

单机模式用于开发、测试,不具备高可用性,可以使用 spring.data.redis.url 直接配置所有的连接信息,规则如下:

redis://:{认证密码}@{Ip}:{端口}/{数据库序列号}

示例:

spring:
  data:
    redis:
      url: redis://:123456@127.0.0.1:6379/0

也可以分别配置:

spring:  
  data:  
    redis:  
      # Ip
      host: 127.0.0.1  
      # 端口
      port: 6379  
      # 数据库序列号
      database: 0 
      # 认证用户名
      username: default
      # 认证密码
      password: 123456  
4.3.2 哨兵

哨兵模式相关的配置前缀为 spring.data.redis.sentinel ,示例:

spring:
  data:
    redis:
      client-type: lettuce
      database: 0
      # 哨兵模式
      sentinel:
        master: mymaster
        nodes: 192.168.56.104:26379,192.168.56.105:26379,192.168.56.106:26379
        # username: sentinel
        password: sentinel123456
      lettuce:
        pool:
          enabled: true
          max-active: 8
          max-idle: 8
          max-wait: 10000
          min-idle: 0
          time-between-eviction-runs: 10000

关于哨兵的配置项说明如下:

  • master:主节点名称。
  • nodesSentinel 节点的地址列表,多个以逗号分割,哨兵会获取到真实的主从节点地址并连接。
  • usernameRedis Sentinel 认证用户名。
  • passwordRedis Sentinel 认证用密码。
4.3.3 集群

集群模式相关的配置前缀为 spring.data.redis.cluster ,示例:

spring:
  data:
    redis:
      client-type: lettuce
      # 集群模式
      # 认证用户名
      # username: cluster
      # 认证密码
      password: cluster123456
      cluster:
        max-redirects: 5
        nodes:
          - 192.168.56.101:6379
          - 192.168.56.101:6380
          - 192.168.56.101:6381
          - 192.168.56.101:6382
          - 192.168.56.101:6383
          - 192.168.56.101:6390
      lettuce:
        pool:
          enabled: true
          max-active: 8
          max-idle: 8
          max-wait: 10000
          min-idle: 0
          time-between-eviction-runs: 10000
        shutdown-timeout: 10000
      connect-timeout: 10000
      timeout: 10000

关于哨兵的配置项说明如下:

  • max-redirects: 集群连接时的最大重定向次数。当应用程序需要连接到集群中的某个节点时,如果该节点不可用或者出现了故障,可以尝试重新路由请求到其他节点,重定向次数设置了最大尝试次数。
  • nodes: 指定了集群中各个节点的地址和端口。

4.4 连接、读取超时

可以配置 Redis 连接、读取超时时间,示例:

spring:  
  data:  
    redis:  
      connect-timeout: 10000 
      timeout: 10000

关于超时配置项说明如下:

  • connect-timeout:指定客户端尝试连接到 Redis 服务器时的超时时间(毫秒为单位)。在指定时间内没有成功建立到 Redis 服务器的连接,将抛出异常。
  • timeout:指定 Redis 读取超时时间(毫秒为单位)。

4.5 SSL Bundle

支持基于 Spring Boot SSL Bundle 机制,配置 SSL 证书。

示例:

spring:
  data:
    redis:
      url: redis://:123456@127.0.0.1:6379/0
      ssl:
      	# 是否开启 SSL
        enabled: true
        # Bundle 名称
        bundle: secure-service
  ssl:
    bundle:
      jks:
        secure-service:
          key:
            alias: "server"
          keystore:
            location: "classpath:server.p12"
            password: "secret"
            type: "PKCS12"

4.6 Redis Repository

可以开启通过定义 Repository 接口操作 Redis

spring:
  data:
    redis:
      repositories:
        enabled: true

4.7 Lettuce 独有

相比于 JedisLettuce 还提供了一些独有的配置:

spring:
  data:
    redis:
      lettuce:
        pool:
          enabled: true
        cluster:
          refresh:
            adaptive: true
            dynamic-refresh-sources: true
            period: 10000
        shutdown-timeout: 10000  

Lettuce 独有的配置项主要是集群自动刷新,例如,集群某个节点迁移了哈希槽,需要刷新本地的集群信息,说明如下:

  • shutdown-timeout: 连接池在关闭时的超时时间,单位是毫秒
  • cluster.refresh.adaptive:启用自适应集群拓扑刷新。 Lettuce 会动态地根据 Redis 集群的拓扑情况来更新本地的集群信息,以确保客户端能够正确地与集群通信。
  • cluster.refresh.dynamic-refresh-sources:启用动态刷新源。 Lettuce 在需要时从多个源刷新集群的拓扑信息,确保及时获取最新的集群状态。
  • cluster.refresh.period:了集群拓扑刷新的周期,单位是毫秒。

5. 入门案例

5.1 引入依赖

创建一个 Spring Boot 项目,引入依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

5.2 配置连接

支持单机、复制、哨兵、集群模式,这里添加一个最简单的单机连接:

spring:
  data:
    redis:
      client-type: lettuce
      # URL
      # url: redis://:123456@127.0.0.1:6379/0
      # # Ip
       host: 127.0.0.1
      # # 端口
       port: 6379
      # # 数据库序列号
       database: 0
      # # 认证用户名
       username: default
      # # 认证密码
       password: 123456
      lettuce:
        pool:
          enabled: true
          max-active: 8
          max-idle: 8
          max-wait: 10000
          min-idle: 0
          time-between-eviction-runs: 10000
        shutdown-timeout: 10000
      connect-timeout: 10000
      timeout: 10000

5.3 操作模板类

RedisTemplate 是在 Spring Boot 环境中和 Redis 打交道的一个模板类,简化了与 Redis 数据库的交互过程,我们可以更加便捷地进行 Redis 的各种操作,如数据存取、异常处理及序列化等。

StringRedisTemplateRedisTemplate 的一个扩展,由于大多数针对 Redis 的操作都是基于字符串的,所以提供了一个专用的类来处理这些操作。

Spring Boot自动配置中,已经帮我们注册了这个两个对象:

@AutoConfiguration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(RedisConnectionDetails.class)
	PropertiesRedisConnectionDetails redisConnectionDetails(RedisProperties properties) {
		return new PropertiesRedisConnectionDetails(properties);
	}

	@Bean
	@ConditionalOnMissingBean(name = "redisTemplate")
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

	@Bean
	@ConditionalOnMissingBean
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
		return new StringRedisTemplate(redisConnectionFactory);
	}
}

RedisTemplate 提供了丰富的 API ,可以很方便的进行各种数据类型进行操作,同时也支持事务、管道、脚本、发布订阅等。

在这里插入图片描述
示例,创建一个需要存储的用户对象, RedisTemplate 默认使用 JDK 序列化,所以需要实现 Serializable

public class User implements Serializable {

    private String name;

    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}   

使用 RedisTemplate 进行操作:

@SpringBootTest
public class RedisTest {

    @Autowired
    RedisTemplate<Object, Object> redisTemplate;

    @Test
    public void test() {
        // 增
        User user = new User("张三", 18);
        redisTemplate.boundHashOps("session").put("id:8989", user);

        // 查
        User getUser = (User)redisTemplate.boundHashOps("session").get("id:8989");
        System.out.println(getUser);
    }
}

查看数据:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精品PPT | 微信云原生大数据平台构建及落地实践.pptx

一、大数据上云概述 1.为什么大数据要上云 2.微信大数据平台架构演进 二、大数据上云基础建设 1.统一编排 2.Pod 设计及大数据配套能力 3.计算组件云环境适配 三、稳定性及效率提升 1.K8S 集群稳定性与弹性配额 2.可观测性与智能运维

Java学习笔记(六)面向对象编程(基础部分)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java面向对象编程&#xff08;基础部分&#xff09;类与对象、方法重载、作用域、构造器细节、this关键字、可变参数使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1…

C# 12 新增功能实操!

前言 今天咱们一起来探索并实践 C# 12 引入的全新功能&#xff01; C#/.NET该如何自学入门&#xff1f; 注意&#xff1a;使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。 主构造函数 主构造函数允许你直接在类定义中声明构造函数参数&#xff0c;…

停车共享小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;停车场管理&#xff0c;停车预约管理&#xff0c;停车缴费管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;停车场&#xff0c;我的 开发系统&…

主图趋势交易九稳量化系统 期货指标公式大全 最准的期货指标源码 看期货涨跌最简单的方法文华财经指标公式源码

交易的动机必须来自于内心&#xff0c;一种解决问题的执着。在整个交易生涯的漫长岁月里&#xff0c;无法始终保持这种热忱。除非亲身体验&#xff0c;否则很难理解这种疯狂的热忱。这是一种高度的专注&#xff0c;其他一切好像都不存在&#xff0c;视野之内没有其他的东西。这…

【STL】之 vector 使用方法及模拟实现

前言&#xff1a; 本文主要讲在C STL库中vector容器的使用方法和底层的模拟实现~ 成员变量的定义&#xff1a; 对于vector容器&#xff0c;我们首先采用三个成员变量去进行定义&#xff0c;分别是&#xff1a; private:iterator _start; // 指向数据块的开始iterator _finish…

论文解读(10)-图神经网络

加油&#xff0c;继续看论文。 这次学图神经网络&#xff0c;这个概念经常在其他论文里出现&#xff0c;所以我想先学习一下这方面的知识。 参考&#xff1a; 【图神经网络综述】一文道尽GNN原理、框架和应用-CSDN博客 【图神经网络】10分钟掌握图神经网络及其经典模型_图神经…

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫&#xff1f;1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP&#xff1a;爬虫的得力助手2.1 代理IP的定义和工作原理2.2 为什么爬虫需要代理IP&#xff1f;2.3 代理IP如何解决爬虫的常见问题&#xff1f; 3. 代理IP的…

shapeit填充

使用shapeit软件进行填充 一&#xff0c;安装 下载地址&#xff0c; 官网里面写得很详细。 https://mathgen.stats.ox.ac.uk/genetics_software/shapeit/shapeit.html 二&#xff0c;步骤 官网里面每一个参数都很详细 1.拆分染色体 for chr in {1..24}; do plink --vcf /…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

Embeddings 赋能 - AI智能匹配,呈现精准内容

&#x1f680;前言 在当今的 AI 时代,传统的相关内容推荐和搜索功能已经显得相对简单和低效。借助 AI 技术,我们可以实现更加智能化和个性化的内容发现体验。 本文将为大家介绍如何利用 OpenAI 的 Embedding 技术,打造出智能、高效的相关内容推荐和搜索功能。 &#x1f680;…

UCOS-III 互斥锁接口详解

在实时操作系统uC/OS-III中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种用于管理对共享资源的访问的同步机制。互斥锁通过保证在任何时刻只有一个任务可以持有锁&#xff0c;从而防止资源竞争问题。同时&#xff0c;uC/OS-III还实现了递归锁定和优先级继承机制&…

七款公司常用的加密软件推荐|2024年公司办公加密软件推荐

在现代企业中&#xff0c;加密软件是保护敏感信息、防止数据泄露和确保通信安全的关键工具。加密软件能够对数据进行加密&#xff0c;使其在未经授权的情况下无法被读取或篡改&#xff0c;本文分享七款加密软件&#xff0c;它们各具特色&#xff0c;能够满足不同的安全需求。 1…

狂赚又吸金 身心灵赛道AI玩法全解析

想必很多初入AI的小白们&#xff0c;小白的不能在小白了&#xff0c;因为在他们眼中&#xff0c;确实对AI一无所知。 基于他们平时刷抖音、刷视频号的习惯&#xff0c;有的时候会发一些传统剪辑的作品&#xff0c;问AI怎么做&#xff1f;很多人认为AI所见的视频&#xff0c;AI…

GeoServer发布MongoDB中的shp数据全流程梳理

目录 前言1.shp转geojson2.shp导入MongoDB3.创建空间索引4.GeoServer安装MongoDB插件5.发布6.注意事项6.1 geojson要去掉头尾6.2 MongoDB4.4以上的mongoimport工具需要额外安装6.3 空间索引是必须项 7.总结 前言 网上搜到的GeoServer发布MongoDB中的矢量数据或shp数据的文章比较…

http协议与nginx

动态页面与静态页面的差别&#xff1a; &#xff08;1&#xff09;URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“&#xff1f;” &#xff08;2&#xff09;后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…

我国工业大模型发展中的四个反差现象

以大模型为代表的新一代人工智能技术正加速推进新型工业化的变革进程。2024年1月&#xff0c;国务院常务会议研究部署推动人工智能赋能新型工业化有关工作&#xff0c;强调以人工智能和制造业深度融合为主线&#xff0c;以智能制造为主攻方向&#xff0c;以场景应用为牵引&…

【Git从入门到精通】——知识概述及Git安装

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Google Test的使用

Google Test支持的操作系统包含下面这些&#xff1a; 1、Linux 2、Mac OS X 3、Windows 4、Cygwin 5、MinGW 6、Windows Mobile 7、Symbian一、google test的基本使用步骤 1、包含gtest/gtest.h头文件 2、使用TEST()宏定义测试case 3、在测试体中使用gooletest断言进行值检查…

Java从入门到精通(十四) ~ 多线程

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、多线程是什么&#xff1f; Java中的多线程 二、使用步骤 1.创建方式 1.1 Thread 线程 1.2 Runnable 任务 1.…