背景
java的方法调用通常都为同步调用,但在一些特殊场景下,需要异步调用,尤其是在主流业务中一些非必要业务,java是否可以异步调用呢?
常规下,咱们第一个想到的就是线程,除了此方法外,spring当前有一注解可以快速实现,即为@Async
前提
使用@Async的前提是要告诉应用,本工程开启了异步调用,当前为了简单起见,可以直接吧@EnableAsync放在启动类上,如下:
@SpringBootApplication
@EnableAsync // 开启异步调用
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
@Async基本使用方式
在方法上直接加注解
@Async
public void test(){
}
自定义线程池执行器代替默认执行器
@Configuration
public class AsyncConfig {
@Bean("asyncTaskExecutor")
public AsyncTaskExecutor asyncTaskExecutor() {
/**
* 参数解释
* corePoolSize:核心线程池大小
* queueCapacity:队列长度
* maxPoolSize:最大线程数
* corePoolSize线程池并发处理任务的线程数,当任务多于corePoolSize时,会把尚未进行处理的任务放到queueCapacity,
* 当queueCapacity放不下时会创建新的线程,当maxPoolSize也不够时,就会抛出异常报错Caused by: java.util.concurrent.RejectedExecutionException:
*/
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(2);
threadPoolTaskExecutor.setQueueCapacity(3);
threadPoolTaskExecutor.setMaxPoolSize(5);
threadPoolTaskExecutor.setThreadNamePrefix("hotel-excutor-");
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
使用:
@Async("asyncTaskExecutor")
public void test(){
}
是否可以像线程一样实现匿名呢?
public void test() {
new AsyncConfig().asyncTaskExecutor().execute(()->{
});
}