@Async 是 Spring 框架中用于声明异步方法的注解。使用此注解的方法会在一个独立的线程中执行,而不是在调用者的线程中,从而实现非阻塞操作。下面是一些关于 @Async 注解及其参数的基本说明:
基本使用
要使用 @Async,首先需要确保已在配置类或 XML 配置文件中启用了异步支持。可以通过在配置类或启动类上添加 @EnableAsync 注解来启用。
@Configuration
@EnableAsync
public class AppConfig {
//......
}
然后可以在任何 Spring 管理的 bean 的方法上使用 @Async 来标记它为异步执行。
@Component
public class AsyncTask {
@Async
public void executeAsyncTask() {
// 异步任务逻辑
}
}
参数说明
value (别名: beanName): 可选参数,指定一个特定的任务执行器(executor)的 bean 名称。如果没有指定,则会使用默认的执行器。例如,如果想要使用自定义的执行器,可以这样做:
@Async("myExecutor")
public void executeAsyncTask() {
// 使用名为'myExecutor'的执行器进行异步任务
}
在这种情况下,你需要在配置类中定义这个执行器 bean。
@Configuration
@Data
public class ExecutorConfig {
@Bean("myExecutor")
public Executor myExecutorPool(){
//此类由Spring提供,org.springframework.scheduling.concurrent包下,是线程池的封装类
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//线程池中线程的名字前缀
executor.setThreadNamePrefix("asyncTaskPool-task-");
//线程池核心线程数量
executor.setCorePoolSize(5);
//线程池最大线程数量
executor.setMaxPoolSize(10);
//线程池空闲线程存活时间,单位秒
executor.setKeepAliveSeconds(100);
//线程池拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程池任务队容量,如果不设置则默认 Integer.MAX_VALUE,
// 队列默认使用LinkedBlockingQueue 若queueCapacity的值 <= 0,则使用SynchronousQueue
//executor.setQueueCapacity(1000);
//线程池中核心线程是否允许超时,默认为false
executor.setAllowCoreThreadTimeOut(true);
//线程池中的超时处理时间,单位秒有一个对应方法为毫秒,,默认为不超时
executor.setAwaitTerminationSeconds(60);
//初始化线程池,不可以少,否者会抛出 线程池没有初始化
executor.initialize();
return executor;
}
}
注意
尽管 @Async
支持一些其他属性如 proxyTargetClass
和 mode
,这些通常是与 AOP 代理机制相关的高级选项,一般不需要特别设置。
此外,重要的是要注意 @Async
方法不会在同一个类内部自动生效,因为 Spring AOP 默认是基于代理的。如果你在同一个类里面直接调用带有 @Async
注解的方法,那么该方法实际上是以同步方式运行的。为了克服这个问题,你可以重构代码,使得异步方法被另一个 Spring 管理的 bean 调用。