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

Spring Boot 多线程例子

在Spring Boot中,多线程可以通过Java的并发工具来实现。以下是一些常见的多线程实现方法:

 

1. 使用`@Async`注解和`CompletableFuture`:

 

首先,需要在Spring Boot应用的主类上添加`@EnableAsync`注解,以启用异步支持。

 

```java

@SpringBootApplication

@EnableAsync

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

```

 

接下来,创建一个服务类,并在需要异步执行的方法上添加`@Async`注解。同时,返回`CompletableFuture`以便于处理异步结果。

 

```java

@Service

public class AsyncService {

    @Async

    public CompletableFuture<String> asyncMethod() {

        // 模拟耗时操作

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return CompletableFuture.completedFuture("异步任务完成");

    }

}

```

 

在控制器或其他服务类中,注入`AsyncService`并调用异步方法。

 

```java

@RestController

public class MyController {

    @Autowired

    private AsyncService asyncService;

 

    @GetMapping("/async")

    public ResponseEntity<String> asyncEndpoint() throws InterruptedException, ExecutionException {

        CompletableFuture<String> result = asyncService.asyncMethod();

        return ResponseEntity.ok("异步请求已发送,结果:" + result.get());

    }

}

```

 

2. 使用`ExecutorService`:

 

在Spring Boot应用中,可以通过`@Bean`注解创建一个`ExecutorService`实例。

 

```java

@Configuration

public class ExecutorConfig {

    @Bean

    public ExecutorService executorService() {

        return Executors.newFixedThreadPool(5);

    }

}

```

 

然后,在服务类中使用`ExecutorService`来执行多线程任务。

 

```java

@Service

public class ThreadPoolService {

    @Autowired

    private ExecutorService executorService;

 

    public void executeTask(Runnable task) {

        executorService.execute(task);

    }

}

```

 

在控制器或其他服务类中,注入`ThreadPoolService`并提交任务。

 

```java

@RestController

public class MyController {

    @Autowired

    private ThreadPoolService threadPoolService;

 

    @GetMapping("/thread-pool")

    public ResponseEntity<String> threadPoolEndpoint() {

        threadPoolService.execute(() -> {

            // 模拟耗时操作

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println("任务完成");

        });

        return ResponseEntity.ok("任务已提交到线程池");

    }

}

```

 

在Spring Boot中,通过`@Async`注解和`CompletableFuture`或者使用`ExecutorService`时,可以通过以下方式传递参数给异步任务:

 

1. 使用`@Async`注解和`CompletableFuture`传递参数:

 

在服务类中,修改`asyncMethod`方法,使其接受参数。然后在方法内部,将这些参数传递给实际的异步任务。

 

```java

@Service

public class AsyncService {

    @Async

    public CompletableFuture<String> asyncMethod(String param1, int param2) {

        // 传递参数给异步任务

        return CompletableFuture.supplyAsync(() -> {

            // 使用参数执行异步任务

            System.out.println("异步任务参数:param1=" + param1 + ", param2=" + param2);

            return "异步任务完成";

        });

    }

}

```

 

在控制器或其他服务类中,注入`AsyncService`并调用异步方法,同时传递参数。

 

```java

@RestController

public class MyController {

    @Autowired

    private AsyncService asyncService;

 

    @GetMapping("/async")

    public ResponseEntity<String> asyncEndpoint() throws InterruptedException, ExecutionException {

        String param1 = "Hello";

        int param2 = 42;

        CompletableFuture<String> result = asyncService.asyncMethod(param1, param2);

        return ResponseEntity.ok("异步请求已发送,结果:" + result.get());

    }

}

```

 

2. 使用`ExecutorService`传递参数:

 

在服务类中,创建一个新的方法(例如`executeTaskWithParams`),该方法接受`Runnable`和一个`Object[]`参数数组。在方法内部,将参数数组传递给`Runnable`的实现。

 

```java

@Service

public class ThreadPoolService {

    @Autowired

    private ExecutorService executorService;

 

    public <T> void executeTaskWithParams(Runnable task, T... params) {

        executorService.execute(() -> {

            // 使用传递的参数执行任务

            System.out.println("任务参数:" + Arrays.toString(params));

            task.run();

        });

    }

}

```

 

创建一个实现`Runnable`接口的类,并在其`run`方法中使用传递的参数。

 

```java

public class MyTask implements Runnable {

    private String param1;

    private int param2;

 

    public MyTask(String param1, int param2) {

        this.param1 = param1;

        this.param2 = param2;

    }

 

    @Override

    public void run() {

        System.out.println("异步任务参数:param1=" + param1 + ", param2=" + param2);

    }

}

```

 

在控制器或其他服务类中,注入`ThreadPoolService`并提交带参数的任务。

 

```java

@RestController

public class MyController {

    @Autowired

    private ThreadPoolService threadPoolService;

 

    @GetMapping("/thread-pool")

    public ResponseEntity<String> threadPoolEndpoint() {

        String param1 = "Hello";

        int param2 = 42;

        threadPoolService.executeTaskWithParams(new MyTask(param1, param2));

        return ResponseEntity.ok("带参数的任务已提交到线程池");

    }

}

```

 

 

相关文章:

Spring Boot 多线程例子

在Spring Boot中&#xff0c;多线程可以通过Java的并发工具来实现。以下是一些常见的多线程实现方法&#xff1a; 1. 使用Async注解和CompletableFuture&#xff1a; 首先&#xff0c;需要在Spring Boot应用的主类上添加EnableAsync注解&#xff0c;以启用异步支持。 java Spr…...

java干货 线程池的分析和使用

文章目录 一、了解线程池1.1 什么是线程池1.2 为什么需要线程池 二、四种线程池的使用2.1 newFixedThreadPool2.2 newCachedThreadPool2.3 newSingleThreadExecutor2.4 newScheduledThreadPool 三、自定义线程池3.1 线程池七大核心参数3.2 线程池内部处理逻辑 一、了解线程池 …...

文本张量入门

张量&#xff0c;英文为Tensor&#xff0c;是机器学习的基本构建模块&#xff0c;是以数字方式表示数据的形式。 张量的基本类型: 创建一个标量&#xff08;0维张量&#xff09;&#xff0c;也就是一个单独的数字 scalar torch.tensor(7) scalar.ndim # 返回张量的维度 0 # …...

js文字如何轮播?

<div class"td-style"> <span class"td-text">内容1内容1内容1内容1内容1内容1</span> </div> css&#xff1a; <style> .td-style { width: 160px; height: 72px; overflow: hidden; white-…...

Linux 五种IO模型

注&#xff1a;还有一种信号驱动IO&#xff0c;使用较少暂不讨论&#xff1b; 一&#xff0c;区分阻塞、非阻塞和同步、异步 看了很多文章对这两组概念解释和对比&#xff0c;说的太复杂了&#xff0c;其实没必要&#xff0c;两句话就能说清楚。 首先&#xff0c;对于读数据rec…...

深度解析响应式异步编程模型

上一篇文章中我们聊了一下线程池,基于线程池的多线程编程是我们在高并发场景下提升系统处理效率的有效手段,但却不是唯一的。今天我们来看一下另一种异步开发的常用手段-响应式编程模型 传统多线程模型的缺陷 多线程模型是目前应用最为广泛的并发编程手段,但凡遇到什么性能…...

一个软件是如何开发出来的呢?

一、前言 如今&#xff0c;AI大爆发的时代&#xff0c;作为一名IT从业者&#xff0c;你是否也想尝试开发一套自己的系统&#xff0c;实现那些看似有可能实现的天马行空的想法&#xff0c;变成一个优秀甚至伟大的产品&#xff0c;甚至带来某个行业的革新&#xff0c;那作为一名…...

宝塔板面有哪些优势

哈喽呀&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;在当今数字化时代&#xff0c;随着云计算和互联网技术的飞速发展&#xff0c;服务器管理成为了许多企业和个人开发者不可或缺的一部分。然而&#xff0c;传统服务器管理方式的复杂性和技术门槛往往令初…...

Mybatis中BaseEntity作用

新建各种对象的时候&#xff0c;一般来说&#xff0c;有几个属性是所有对象共有的&#xff0c;比如说id,is_del&#xff0c;is_enable这些&#xff0c;然后设置一个基础对象&#xff0c;以后新建所有对象的时候都继承它&#xff0c;就省的每次都要写这些共有的属性了...

IDEA2023中使用run Dashboard面板?实现批量运行微服务

1、直接点击Add service--->Run Configuration Type---->Spring Boot 2、这样就出现了run Dashboard面板&#xff0c;可同时运行多个工程模块&#xff0c;shift选中所有启动类组命名&#xff08;Group Configurations&#xff09; 3、启动所有的项目...

分数受限,鱼和熊掌如何兼得?专业or学校,这样选最明智!

文章目录 引言一、专业解析二、名校效应分析三、好专业和好学校的权衡结论个人建议 引言 24年高考帷幕落下&#xff0c;一场新的思考与选择悄然来临。对于每一位高考考生&#xff0c;学校和专业都是开启大学新生活的两个前置必选项。但有时候“鱼与熊掌不可兼得”&#xff0c;…...

CentOS 8.5 - 配置ssh的免密登录

文章目录 生成ssh密钥公钥内容放入服务器 生成ssh密钥 在本地主机安装 ssh工具&#xff0c;并生成公钥、私钥。 # 命令行输入 ssh-keygen -r rsa# 会在当前用户的家目录下生成一个.ssh目录公钥内容放入服务器 将上一步生成的id_rsa.pub公钥的内容复制到远程服务器 # 编辑文…...

反转链表(java精简版)

反转一个单向链表。 public class ReversingLinkedList {static class Node {int val;Node next;public Node(int val) {this.val val;}public boolean hasNext() {return next ! null;}}public static void main(String[] args) {//构造Node head null;Node shift null;for…...

QPair使用详解

QPair使用详解 一、创建和初始化 QPair1.1 QPair默认构造1.2 使用值初始化1.3 QPair拷贝构造 二、访问 QPair 的值2.1 修改 QPair 的值2.2 比较 QPair2.3 使用 qMakePair 辅助函数2.4 使用 QPair 的场景 三、QPair自定结构体3.1 定义自定义结构体3.2 在 QPair 中使用自定义结构…...

C# 语言在AGI 赛道上能做什么

自从2022年11月OpenAI正式对外发布ChatGPT依赖&#xff0c;AGI 这条赛道上就挤满了重量级的选手&#xff0c;各大头部公司纷纷下场布局。原本就在机器学习、深度学习领域占据No.1的Python语言更是继续稳固了自己AI一哥的位置。凭借着Microsoft 和 OpenAI 长期以来一直是紧密相连…...

微信小程序-API 本地存储

一.本地存储-同步API 存储 &#xff1a; wx.setStorageSync 获取&#xff1a;wx.getStorageSync 删除&#xff1a;wx.removeStorageSync 清空&#xff1a;wx.clearStorageSync 代码&#xff1a; save(){//存储wx.setStorageSync(id, 1) wx.setStorageSync(obj, {name:"te…...

TensorFlow音频分类修复

原先传wav格式,后来发现前端生成的wav格式不完整 后端改mp3 其实是mp3和wav都可以接收 前端MP3和wav格式不正确,导致可以接收,但都无法计算时长 该文作废,可能导致音频分类不准确 修复TensorFlow放到生产后报错问题-CSDN博客 依赖 <dependency><groupId>or…...

C#学习系列之ListView垂直滚动

C#学习系列之ListView垂直滚动 前言垂直滚动总结 前言 当ListView中不断增加新内容&#xff0c;经常是纵向滚动。 垂直滚动 这个是关键&#xff1a;<VirtualizingStackPanel/> <ListView.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel/>&…...

MySQL 常用函数总结

MySQL 提供了丰富的内置函数&#xff0c;用于在查询中进行各种计算、字符串处理、日期和时间操作等。这些函数可以帮助我们更有效地从数据库中检索和处理数据。下面将总结一些 MySQL 中常用的函数及其用法。 1. 数值函数 1.1 ROUND() ROUND() 函数用于对数值进行四舍五入操作…...

SpingBoot快速入门下

响应HttpServietResponse 介绍 将ResponseBody 加到Controller方法/类上 作用&#xff1a;将方法返回值直接响应&#xff0c;如果返回值是 实体对象/集合&#xff0c;将会自动转JSON格式响应 RestController Controller ResponseBody; 一般响应 统一响应 在实际开发中一般…...

AI驱动的网络安全:深度学习与LLM在威胁检测与教育中的应用

1. 项目概述&#xff1a;AI赋能的网络安全新范式在网络安全领域&#xff0c;我们正面临着一个日益严峻的悖论&#xff1a;一方面&#xff0c;攻击手段正变得前所未有的复杂和自动化&#xff1b;另一方面&#xff0c;74%的安全事件仍然源于人为因素。这种技术与人的双重挑战催生…...

Midjourney V6 acrylic paint提示词工程:从模糊描述到精准输出的12个专业级Prompt模板(含色彩层厚/笔触硬度/画布纹理三重控制)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney V6丙烯画风格的核心演进与底层渲染机制 Midjourney V6 对丙烯画&#xff08;Acrylic Painting&#xff09;风格的建模已脱离早期依赖纹理叠加与后处理滤镜的粗粒度模拟&#xff0c;转向基于…...

ZonyLrcToolsX:轻松获取完美歌词的跨平台解决方案

ZonyLrcToolsX&#xff1a;轻松获取完美歌词的跨平台解决方案 【免费下载链接】ZonyLrcToolsX ZonyLrcToolsX 是一个能够方便地下载歌词的小软件。 项目地址: https://gitcode.com/gh_mirrors/zo/ZonyLrcToolsX 你是否曾经为音乐播放器缺少歌词而烦恼&#xff1f;是否厌…...

手把手教你用Simulink搭建BUCK电路:从主电路到PID整定的保姆级流程

手把手教你用Simulink搭建BUCK电路&#xff1a;从主电路到PID整定的保姆级流程 电力电子技术作为现代能源转换的核心&#xff0c;BUCK电路因其高效的降压特性被广泛应用于电源设计领域。对于初学者而言&#xff0c;理论知识与实际仿真之间往往存在一道难以跨越的鸿沟——明明理…...

9 款 AI 写论文哪个好?2026 深度实测|虎贲等考 AI 凭真文献 + 真实图表 + 全流程实证,稳坐毕业论文首选

毕业季高频提问&#xff1a;9 款 AI 写论文哪个好&#xff1f;市面上工具看似大同小异&#xff0c;实则在文献真实性、实证图表、全流程覆盖、学术合规上差距巨大。通用大模型文献造假、普通工具无实证能力、小众平台功能残缺&#xff0c;选错轻则反复改稿&#xff0c;重则查重…...

实战解析:用高斯过程回归搞定不确定性预测

1. 高斯过程回归能解决什么问题 我第一次接触高斯过程回归是在一个金融风控项目里。当时我们需要预测未来三个月的用户违约概率&#xff0c;但传统机器学习模型只能给出一个冰冷的数字预测&#xff0c;完全无法体现预测的可信程度。这就像天气预报只告诉你"明天会下雨&quo…...

戴尔G15终极散热解决方案:TCC-G15完整使用指南

戴尔G15终极散热解决方案&#xff1a;TCC-G15完整使用指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为戴尔G15笔记本的高温问题而烦恼吗&#xff1f…...

【Leona】BoxId 是什么-设备指纹参数

BoxId 是什么&#xff1f;从 Leona.sense() 到 /v1/verdict 的可落地闭环&#xff1a;签名、落库、错误处理与回归验证&#xff08;基于公开示例&#xff09; TL;DR BoxId 不是“风险结论”&#xff0c;而是一次“证据报告兑换券”&#xff1a;端上拿 BoxId&#xff0c;后端换证…...

VideoDownloadHelper:3步实现全网视频下载的智能工具

VideoDownloadHelper&#xff1a;3步实现全网视频下载的智能工具 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper VideoDownloadHelper是一款专…...

让机房管理告别粗放,每一寸资源都物尽其用

对于机房运维人员而言&#xff0c;U 位管理看似是基础小事&#xff0c;却是决定机房运维效率、资产安全与合规水平的关键。当前&#xff0c;不少企业机房、单位机房仍沿用传统人工管理模式&#xff0c;机柜 U 位全靠记忆、台账全靠 Excel、盘点全靠熬夜&#xff0c;看似节省了成…...