首页 > 编程语言 >Java注解详解:@Async异步

Java注解详解:@Async异步

时间:2024-08-13 15:55:22浏览次数:10  
标签:异步 Java Spring 线程 Async 方法 public

使用 @Async 进行异步方法调用

@Async 是 Spring 框架里的一个小工具,能让你的方法在后台偷偷跑起来,不影响主线程的工作。
这个方法特别适合用来处理那些不需要立即给用户反馈的任务,比如发个邮件啊,处理个大文件啥的。

1. 配置异步支持

首先,你得在 Spring 配置类里开个绿灯,让异步处理跑起来:

@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        return new SimpleAsyncTaskExecutor();
    }
}

@EnableAsync 就是开启异步的开关。然后配置个线程池之类的,让后台任务有地方跑。

2. 在方法上使用 @Async 注解

接下来,只需要在你想让后台偷偷干活的方法上加个 @Async 注解就行了:

@Service
public class MyService {

    @Async
    public void asyncMethod() {
        // 这个方法会在后台异步执行
        System.out.println("异步方法开始执行");
        try {
            Thread.sleep(5000); // 模拟一个耗时的任务
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("异步方法执行完毕");
    }
}
3. 调用异步方法

当你调用带有 @Async 的方法时,它会在后台悄悄地执行,不会影响主线程继续处理其他任务:

@RestController
public class MyController {

    private final MyService myService;

    public MyController(MyService myService) {
        this.myService = myService;
    }

    @GetMapping("/startAsync")
    public String startAsync() {
        myService.asyncMethod();
        return "异步方法已经开始跑了,别担心";
    }
}

上面的例子中,当你访问 /startAsync 这个接口时,asyncMethod 会在后台跑起来,用户立马就能收到反馈,不用傻等。

注意事项

  • 返回类型:

    • 你可以让异步方法返回 voidFuture<?>CompletableFuture<?>。这样的话,如果你还想在以后获取任务的结果或监控任务的状态,也可以做到。
  • 调用者与被调用者:

    • 小提醒一下,@Async 的方法不能在同一个类里直接调用,不然它还是会在主线程里执行,达不到异步的效果。最好是在不同的类里调用,或者通过 AOP 代理对象来调用。
  • 线程池配置:

    • Spring 默认使用 SimpleAsyncTaskExecutor 来跑这些后台任务。如果你的项目有特别的性能要求,可以自定义一下线程池,灵活调整后台任务的处理方式。

@Async 的原理

@Async 的核心原理是 AOP(面向切面编程)。
当你在方法上加了 @Async 注解,Spring 会创建一个代理对象来处理这个方法的调用。
这个代理对象会把实际的调用任务提交到一个线程池里去执行,
这样主线程就不会被阻塞,可以继续处理其他请求。

具体来说,@Async 使用的是 Spring 的 TaskExecutor 机制。
你可以通过配置线程池来管理这些异步任务的执行,比如设置线程的数量、任务队列的大小等。
如果你没有特别配置,Spring 会使用一个默认的 SimpleAsyncTaskExecutor,它会为每个任务创建一个新的线程。

所以,异步执行的效果其实是由后台的线程池来实现的。
通过这个机制,Spring 可以非常方便地处理大量并发任务,提升应用的性能和响应速度。

标签:异步,Java,Spring,线程,Async,方法,public
From: https://blog.csdn.net/m0_48038376/article/details/141165736

相关文章

  • Java 100道算法
    数组相关查找数组中的最大和最小元素实现数组的反转查找数组中的第二大元素从数组中删除重复元素合并两个有序数组找到数组中和为指定值的两个数实现一个动态数组(ArrayList)找到数组中出现次数超过一半的元素寻找数组的连续子数组和为定值查找数组中的峰值元素字符串......
  • Java栈溢出|内存泄漏|内存溢出
    Java虚拟机栈是线程私有的,它的生命周期和线程同步一个线程每执行到一个方法,JVM就会创建一个栈帧(用于存储基本数据类型、对象指针和返回值等),并将栈帧压入栈中。代码示例:publicclassExample{publicstaticvoidmain(String[]args){Exampleexample=newExa......
  • java基础-封装
    封装(数据的隐藏)私有属性实现方式:get/set封装(Encapsulation)是面向对象编程中的一个核心概念,它指的是将对象的内部状态(即数据)和行为(即方法)隐藏起来,只暴露给外部一些必要的接口,以保护对象的完整性和安全性。通俗理解:想象一个遥控器:按钮:这是你能看到和操作的部分,通过按......
  • 24-08-08 JavaSE Map集合
    24-08-08javaSEMap集合Map接口的特点Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value(双列元素)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中3.Map中的key不允许重复,原因和HashSet一样,前面分析过源码.Map......
  • Java String常用类、数组、日期时间
    JavaString类一、创建字符串1、简单方式:Stringstr="seventeen";2、用构造函数创建字符串:Stringstr2=newString("seventeen");String创建的字符串存储在公共池中,而new创建的字符串对象在堆上String类是不可改变的,所以一旦创建了String对象,那它的值就无法改变了如果需......
  • JavaScript函数
    定义函数形如functionabs(x){if(x>=0){returnx;}else{return-x;}}或varabs=function(x){if(x>=0){returnx;}else{return-x;}};如上所表达的函数为一个匿名函数,它没有函数名,该......
  • 【原创】java+swing+mysql校园表白墙系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:昨天七夕,大家都去约会了,趁着有时间写了一个校园表白墙系统。在校园环境中,学生们正处于青春期,情感丰富且......
  • 【原创】java+swing+mysql简单图书信息管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:编程小白们刚入门,尤其在学了一点java的基础之后,想通过自己动手来实现一个比较基础的小项目,由于编程经验......
  • 问题 IDEA创建Sping项目只能勾选17和21,却无法使用Java8
    想创建一个springboot项目,本地安装jdk版本为1.8,但是在使用SpringInitializr创建项目时,版本只能选择21或17在JDK为1.8的情况下,无论选择Java17版本或者21版本时,都会报错。Java17和Java8(JDK1.8)的区别版本号:Java17是JavaSE17的版本,而JDK1.8是JavaSE8的版本。发......
  • Java SSE:实现服务器推送数据客户端
            体验过大语言模型的人(chatgpt,文心一言,通义千问...)都知道,大模型的回答是一边思考一边返回数据的,属于流式响应。要达到这种效果就需要实现前后端的即时通讯。SSE        SSE(Server-sentEvents):WebSocket的一种轻量代替方案,使用HTTP协议,用于实现服务......