我们在项目中,经常会遇到异步调用的问题,异步调用的效果就是主线程可以提前返回,然后交由任务子线程进行处理。在SpringBoot工程中,如何实现异步;简单汇总了一下二种方法。
第一种:自定义线程类。
第二种:使用@Async和@EnableAsync注解;
一.自定义线程类
新建线程类实现Runnable接口:
Controller类中调用:
执行结果:
从结果中可以看出,Controller类的thread3方法执行时间间隔为0秒,而ThreadTask类的run方法执行时间间隔为3秒。和我们预期的相符。
二.使用@Async和@EnableAsync注解
第一步:首先使用@EnableAsync注解开启异步调用功能
该注解可以放在以下几个位置:
1:启动类上方
@SpringBootApplication
@EnableAsync
public class SjcjApplication{
public static void main(String[] args) {
SpringApplication.run(SjcjApplication.class, args);
}
}
2:当前需要执行异步调用的类上方
3:配置类上方使用
在SpringBoot中 该配置类不仅可以开启异步调用开启异步调用,我们还可以使用线程池对开启的异步线程进行统一管理。
package com.inspur.tax.config;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* @ClassName TaskPoolConfig
* @Description 线程池配置
* @author Tony
* @date 2020年3月14日 上午9:53:27
* @version 1.0
*/
@EnableAsync
@EnableScheduling
@Configuration
public class TaskPoolConfig {
@Bean(name = "taskPoolExecutor")
public ThreadPoolExecutor getThreadPoolExecutor() {
BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);
ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,60, TimeUnit.MILLISECONDS,bqueue);
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return pool;
}
@Bean(name = "asyncPoolExecutor")
public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(20);
taskExecutor.setKeepAliveSeconds(12000);
taskExecutor.setThreadNamePrefix("AsyncPool-");
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
taskExecutor.setAwaitTerminationSeconds(60);
taskExecutor.initialize();
return taskExecutor;
}
}
配置类中,如果不指定 Executor ,则默认使用 SimpleAsyncTaskExecutor。
新建TestAsyncService类,并在该类中新建serviceThread4方法,在serviceThread4方法上加@Async注解
然后在Controller调用:将TestAsyncService类注入到TestAsyncController类,并新建thread4方法,其中是调用taService.serviceThread4();异步方法。
执行结果: