Spring开发实践(二)

@EnableAsync@Async 注解的使用方法

@EnableAsync@Async 是Spring框架中的两个注解,用于启用和使用异步方法执行。它们可以帮助你在Spring应用程序中实现异步编程,从而提高应用程序的性能和响应速度。

@EnableAsync

@EnableAsync 注解用于启用Spring的异步方法执行功能。你需要在配置类或主应用程序类上添加这个注解,以便Spring能够扫描并处理 @Async 注解的方法。

@Async

@Async 注解用于标记一个方法为异步方法。当Spring调用这个方法时,它会在一个独立的线程中执行,而不会阻塞调用者的线程。

使用步骤

  1. 启用异步支持:在配置类或主应用程序类上添加 @EnableAsync 注解。
  2. 标记异步方法:在需要异步执行的方法上添加 @Async 注解。

示例代码

1. 启用异步支持

在主应用程序类或配置类上添加 @EnableAsync 注解。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
2. 标记异步方法

在需要异步执行的方法上添加 @Async 注解。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class MyService {@Asyncpublic void performAsyncTask() {// 这个方法将在一个独立的线程中执行System.out.println("执行异步任务");try {Thread.sleep(5000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("异步任务完成");}
}
3. 调用异步方法

在其他地方调用异步方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@Autowiredprivate MyService myService;@GetMapping("/async")public String executeAsyncTask() {myService.performAsyncTask();return "异步任务已提交";}
}

注意事项

  1. 返回类型:异步方法可以返回 voidFutureCompletableFuture。如果需要获取异步方法的结果,可以使用 FutureCompletableFuture
@Async
public CompletableFuture<String> performAsyncTaskWithResult() {// 这个方法将在一个独立的线程中执行System.out.println("执行异步任务");try {Thread.sleep(5000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}return CompletableFuture.completedFuture("异步任务完成");
}
  1. 线程池配置:默认情况下,Spring使用一个简单的线程池来执行异步任务。你可以自定义线程池,以满足特定的性能需求。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
@EnableAsync
public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.setThreadNamePrefix("Async-");executor.initialize();return executor;}
}
  1. 类级别的 @Async:你也可以在类级别上使用 @Async 注解,表示该类中的所有方法都将异步执行。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
@Async
public class MyService {public void performAsyncTask() {// 这个方法将在一个独立的线程中执行System.out.println("执行异步任务");}
}

通过使用 @EnableAsync@Async 注解,你可以轻松地在Spring应用程序中实现异步方法执行,从而提高应用程序的性能和响应速度。

获取异步结果

主线程可以通过 CompletableFuture 的方法来获取异步任务的结果。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;@RestController
public class MyController {@Autowiredprivate MyService myService;@GetMapping("/async")public String executeAsyncTask() throws ExecutionException, InterruptedException {// 调用异步方法,立即返回一个 CompletableFuture 对象CompletableFuture<String> future = myService.performAsyncTaskWithResult();// 主线程不会被阻塞,可以继续执行其他操作System.out.println("异步任务已提交");// 获取异步任务的结果(会阻塞直到结果可用)String result = future.get();return result;}
}

总结

  • 调用异步方法时:由于 @Async 注解,异步方法将在一个独立的线程中执行,调用该方法的主线程不会被阻塞。
  • 立即返回 CompletableFuture 对象:调用异步方法后,主线程会立即返回一个 CompletableFuture 对象,表示异步任务的结果。
  • 获取结果:主线程可以通过 CompletableFuture 的方法来获取异步任务的结果,而不需要等待异步任务完成。

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

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

相关文章

ARM Ubuntu 主机安装指定版本Python

要在你的ARM Linux主机上安装Python 3.12&#xff0c;你可以从源码编译安装。以下是具体步骤&#xff1a; 步骤1&#xff1a;安装依赖 首先&#xff0c;确保你有必要的编译工具和依赖包&#xff1a; sudo apt-get update sudo apt-get install -y build-essential libssl-d…

【每日一练】python的类.对象.成员.行为.方法传参综合实例(保姆式教学)

运行结果: 本节课程内容&#xff1a;类的使用 1.掌握类的定义和使用方法 2.掌握类的成员的方法使用 3.掌握self关键字的作用 4.定义在类里的函数是类的一种行为&#xff0c;叫方法 5.带传参的行为使用方法 类基本分两部分组成&#xff1a;1.属性,2.方法 类的使用语法&#xf…

springCloud整合Dubbo案例

前言&#xff1a; 好久没有使用dubbo了&#xff0c;温习一下。 一、先搭建一个SpringCloud框架 整体框架如下图 1. 先创建一个父工程&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4…

开发者必读:获取电商API的多种渠道

开发电商软件往往需要对接电商API&#xff0c;电商API可以从哪些渠道获取&#xff1f;下面给大家介绍两种获取渠道。 一、从电商平台开放平台获取电商API 电商平台的开放平台是获取电商API最直接的渠道&#xff0c;但是电商平台较多&#xff0c;每一个电商平台都需要单…

Vue3 引入腾讯地图 包含标注简易操作

1. 引入腾讯地图API JavaScript API | 腾讯位置服务 (qq.com) 首先在官网注册账号 并正确获取并配置key后 找到合适的引入方式 本文不涉及版本操作和附加库 据体引入参数参考如下图 具体以链接中官方参数为准标题 在项目根目录 index.html 中 写入如下代码 <!-- 引入腾…

Socks5代理为什么比HTTP代理快?

在数字化日益深入的时代&#xff0c;网络安全和隐私保护成为了公众关注的焦点。为了应对网络威胁&#xff0c;保护个人隐私和数据安全&#xff0c;代理技术应运而生。在众多代理协议中&#xff0c;SOCKS5代理和HTTP代理是两种较为常见的选择。然而&#xff0c;为何SOCKS5代理在…

网页设计零基础入门:前端技术全攻略

在当今互联网飞速发展的时代&#xff0c;前端网页设计已经成为一个备受关注的领域。随着其重要性的不断提高&#xff0c;越来越多的专业人士和爱好者开始对前端设计感兴趣&#xff0c;希望通过掌握这项技术开辟自己的职业道路。然而&#xff0c;对于新手设计师来说&#xff0c;…

ollama + lobechat 搭建自己的多模型助手

背景 人工智能已经推出了快2年了&#xff0c;各种模型和插件&#xff0c;有渐渐变成熟的趋势&#xff0c;打造一个类似 hao123网站的人工智能模型入口&#xff0c;也变得有需求了。用户会去比较多个ai给出的答案&#xff0c;作为程序员想拥有一台自己的GPU服务器来为自己服务。…

如何在vue的项目中导入阿里巴巴图标库

阿里巴巴矢量图标库官网&#xff1a;iconfont-阿里巴巴矢量图标库 选择你喜欢的图标&#xff0c;添加入库 点击添加至项目&#xff0c;并新建文件夹&#xff0c;点击确定 选择font-class&#xff0c;点击生成代码 代码生成后&#xff0c;在网站上打开 全选复制到style 点击复制…

【TB作品】MSP430F6638单片机,频率计

基于 MSP430-FFTB6638 实验箱 频率测量与通信系统 利用 MCU 定时器模块相关功能设计实现数字频率计功能&#xff0c;测量范围&#xff1a;100~10000Hz&#xff0c; 测量误差≤1%&#xff0c;测量速度≤1 秒。测量结果本地显示&#xff08;段式 LCD、字符型 LCD、点阵 LCD &…

springboot系列九: 接收参数相关注解

文章目录 基本介绍接收参数相关注解应用实例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute 复杂参数基本介绍应用实例 自定义对象参数-自动封装基本介绍应用实例 基本介绍 1.SpringBoot 接收客户端提交数据 / 参数会使用到相…

【小白也能看的懂】想要玩转AI大模型,这4招你得知道

前言 对于大部分人来说&#xff0c;能够灵活使用AI工具&#xff0c;并对自己每个常用的AI工具优劣势很清楚&#xff0c;就已经足够了。不过&#xff0c;毕竟AI发展实在太快&#xff0c;多了解一些相关的知识点&#xff0c;以全局的视角去看AI&#xff0c;可以避免管中窥豹&…

编程语言现状:深入剖析与未来展望

编程语言现状&#xff1a;深入剖析与未来展望 在数字化时代的浪潮中&#xff0c;编程语言作为信息科技领域的基石&#xff0c;正经历着前所未有的变革与发展。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析编程语言的现状&#xff0c;并展望其未来的发…

【错题集-编程题】买卖股票的最好时机(四)(动态规划)

力扣对应题目链接&#xff1a;188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;买卖股票的最好时机(四)_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 1、状态表示 为了更加清晰的区分买入和卖出&#xff0c;我们换成有股…

【鸿蒙学习笔记】通过用户首选项实现数据持久化

官方文档&#xff1a;通过用户首选项实现数据持久化 目录标题 使用场景第1步&#xff1a;源码第2步&#xff1a;启动模拟器第3步&#xff1a;启动entry第6步&#xff1a;操作样例2 使用场景 Preferences会将该数据缓存在内存中&#xff0c;当用户读取的时候&#xff0c;能够快…

springboot对象参数赋值变化

java springboot 项目&#xff0c; 通过接口修改Person类 name值&#xff0c; 在别的类中&#xff0c;注入Person类 Resource Person person&#xff0c; 为什么拿不到 接口修改的 name的值&#xff0c;是Person类 不同的对象造成的 吗 参数对象和注入对象区别 Person类&…

云WAF | 云waf基础知识详解

随着数字时代的到来&#xff0c;网络安全问题越来越突出&#xff0c; Web应用防火墙&#xff08;WAF&#xff09;是保障 Web应用安全的一道重要防线。在云计算环境下&#xff0c;云环路由云平台&#xff08;WAF&#xff09;的出现&#xff0c;其融合了 WAF的能力和云计算的灵活…

【Linux】IP地址与主机名

文章目录 1.IP地址2.特殊IP地址3.主机名4.域名解析 1.IP地址 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 IP地址主要有2个版本&#xff0c;V4版本和V6版本 IPv4版本的地址格式是&#xff1a;a.b.c.d,其中abcd表示0~255的数字&#xff0c;如192.168.…

PS 2024【最新】中文白嫖版!,安装教程,图文步骤

文章目录 软件介绍软件下载安装步骤 软件介绍 Photoshop&#xff0c;简称“PS” Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地…

利用AI快速上手新项目:开发者的高效指南

使用AI帮助开发者熟悉新的项目 在现代软件开发中&#xff0c;开发者经常需要快速熟悉一个新的项目。项目可能包含复杂的结构和大量的文件&#xff0c;这对新手开发者来说无疑是一项挑战。幸运的是&#xff0c;借助AI技术&#xff0c;我们可以更加高效地了解项目结构&#xff0…