@Async

Spring框架中的 ​@Async​注解是为了支持异步方法调用而设计的。

异步方法调用是指调用方在发起方法调用后,不需要等待被调用方法的结果返回,而是可以立即继续执行其他任务。这种方式能够提高系统的并发性和响应性,特别适用于一些耗时较长、不需要立即获取结果的操作。

  • 引入相关依赖(pom.xml):
java 复制代码
<dependencies>
    <!--其他依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--添加以下依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-task</artifactId>
    </dependency>
    <!--其他依赖-->
</dependencies>
  • 在启动类上添加@EnableAsync注解,开启异步功能。
java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • 创建一个Service类,在其中定义标有@Async注解的异步方法。
java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyService.class);

    @Async
    public void asyncMethod() {
        LOGGER.info("Async method start");
        // 模拟耗时操作
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LOGGER.info("Async method end");
    }
}
  • 创建一个Controller类,调用异步方法。
java 复制代码
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 {
    @Autowired
    private MyService myService;

    @GetMapping("/async")
    public String async() {
        myService.asyncMethod();
        return "Async method called";
    }
}

当访问 ​http://localhost:8080/async​时,MyService类中的asyncMethod方法将在独立线程中异步执行,而不会阻塞当前请求线程。在日志中可以看到异步方法的开始和结束输出。

要使@Async注解生效,还需要在配置类中添加@EnableAsync注解,并配置合适的线程池。例如,在Spring Boot中可以通过修改application.properties文件添加以下配置:

java 复制代码
spring.task.execution.pool.core-size=5
spring.task.execution.pool.max-size=10
spring.task.execution.pool.queue-capacity=10000
spring.task.execution.pool.thread-name-prefix=my-async-
相关推荐
It's now15 分钟前
Spring Framework 7.0 原生弹性功能系统讲解
java·后端·spring
为爱停留38 分钟前
Spring AI实现RAG(检索增强生成)详解与实践
人工智能·深度学习·spring
静水楼台x1 小时前
Java之String系列--intern方法的作用及原理
java·spring
谷哥的小弟2 小时前
Spring Framework源码解析——GenericTypeResolver
java·spring·源码
廋到被风吹走3 小时前
【Spring】事务管理深度解析|从原理到实战
java·spring
IT_Octopus7 小时前
java多线程环境下 安全地初始化缓存(避免缓存击穿),同时兼顾性能 的双重检查锁方案
java·spring·缓存
Java水解9 小时前
【Spring Boot 单元测试教程】从环境搭建到代码验证的完整实践
后端·spring
pyniu10 小时前
项目实站day7--功能之营业额统计,用户数量统计
java·开发语言·spring boot·spring
小小哭包10 小时前
Spring+MyBatis实现数据库读写分离方案
数据库·spring·mybatis
Andy工程师11 小时前
logback-spring.xml优先级更高
xml·spring·logback