源码:
它是spring scheduling下的一个注解
在Java中,@Async
注解是Spring框架提供的,用于支持异步方法调用。它允许你将一个方法标记为异步执行,这意味着该方法的调用不会阻塞当前线程,而是由Spring管理的异步任务执行器在后台线程池中执行。
下面是如何在Spring中使用@Async
的基本步骤:
-
配置异步任务执行器: 在你的Spring配置类中,需要定义一个异步任务执行器(
TaskExecutor
)。这通常通过@Bean注解的方法来实现。@Configuration @EnableAsync public class AsyncConfig { @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(20); executor.initialize(); return executor; } }
-
注意如果在spring中没有将ThreadPoolTaskExecutor对象初始化为bean的话而且必须名称为t
askExecutor
,spring会默认使用SimpleAsyncTaskExecutor 去执行异步方法。如果你用的是springboot的话,就没问题,因为springboot有自动装配,它会把ThreadPoolTaskExecutor自动装配为taskExecutor bean对象,可以直接用。
-
启用异步支持: 你需要在配置类上添加
@EnableAsync
注解,以启用异步方法的支持。
SimpleAsyncTaskExecutor
而它不是一个线程池的实现类,它只是不断的创建线程然后执行任务,会导致无限的创建线程,后果很严重
protected void doExecute(Runnable task) {
Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
thread.start();
}
-
标记异步方法: 在你想异步执行的方法上添加
@Async
注解。通常,这个方法应该在一个带有@Component注解的类中。@Component public class MyService { @Async public void doSomethingAsync() { // 异步执行的代码 } }
-
调用异步方法: 你可以像调用普通方法一样调用异步方法,但是需要注意,由于它是异步执行的,所以你不能等待其返回值或抛出的异常。如果你需要返回值,可以使用
CompletableFuture
作为返回类型。@Autowired private MyService myService; public void someMethod() { CompletableFuture<Void> future = myService.doSomethingAsync(); // 这里可以继续执行其他操作,不会被doSomethingAsync阻塞 }
请记住,在使用@Async
时,确保你的Spring Bean是在Spring容器管理之下的,并且要正确处理异步方法的异常和返回结果。如果方法抛出异常,而你没有处理,那么这些异常可能会丢失或者导致不可预期的行为。