Spring中的@Async作用及使用

前言:@Async 是 Spring 框架提供的一个注解,用于标识一个方法是异步执行的。当一个方法被 @Async 注解修饰时,Spring 将会在方法调用时创建一个新的线程来执行该方法,而不是在当前线程中同步执行。

作用:

  • 异步执行:通过 @Async 注解,你可以将某个方法标记为异步执行的,使得该方法在被调用时会在新的线程中执行,而不会阻塞当前线程。这对于需要执行耗时操作或并发处理的场景非常有用,可以提高系统的性能和响应速度。
  • 并发处理:使用 @Async 注解可以实现并发处理,多个被 @Async 注解修饰的方法可以同时执行,提升系统的吞吐量和并发能力。
  • 异步回调:通过 @Async 注解可以实现异步回调的功能。当一个方法被标记为 @Async 后,可以在方法中返回一个 Future 或 CompletableFuture 对象,用于接收异步执行结果。你可以在后续的代码中异步地获取执行结果,或者注册回调函数来处理结果。
  • 任务调度:@Async 注解通常与 Spring 的任务调度功能结合使用,例如结合 @Scheduled 注解实现定时任务的异步执行。

使用:

  • 需要在 Spring 配置文件中启用异步支持,并配置一个线程池供异步方法使用。例如,可以在配置类中使用 @EnableAsync 注解启用异步支持,并通过 TaskExecutor 配置一个线程池。代码如下:
@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(10);
        executor.initialize();
        return executor;
    }
}
  • 然后,在需要异步执行的方法上添加 @Async 注解即可:
@Service
public class MyService {

    @Async
    public void asyncMethod() {
        // 异步执行的逻辑
    }
}
  • 在启动类上添加@EnableAsync注解。来开启异步处理功能

注意:

  • 被 @Async 注解修饰的方法必须定义在 Spring 管理的 Bean 中才能生效。Spring 通过代理机制来拦截异步方法的调用并执行异步操作
  • 异步方法不能与同一个类中的其他非异步方法互相调用。如果在同一个类中调用了异步方法,实际上是通过代理对象调用的,而不会触发异步调用。
  • 异步方法返回类型应该是 void 或者 java.util.concurrent.Future如果方法需要返回结果,可以使用 Future 来包装异步操作的结果。

  • 异步方法内部的异常无法直接捕获,因为异步方法是在调用线程和执行线程之间的异步切换。如果需要捕获异常并进行处理,可以通过 Future 对象的 get() 方法来获取结果,并处理可能抛出的异常。

  • 注意控制异步方法的并发度。默认情况下,Spring 使用线程池来管理异步方法的执行。如果并发度过高,可能导致线程池资源耗尽或系统负载过重。可以通过配置线程池参数来控制并发度。

  • 对于有事务的异步方法,需要注意事务的传播行为。默认情况下,Spring 会创建一个新的事务来执行异步方法。可以使用 Propagation 枚举值来控制事务的传播行为。

  • 异步方法应该谨慎地使用,避免过度使用导致系统复杂性增加。通常适用于执行非阻塞、耗时较长的操作,如网络调用、IO 操作等。

最后还是附上官网文档:Async (Spring Framework 6.1.4 API)

你可能感兴趣的:(工作随笔,#spring,spring,java,后端)