先了解异步调用和同步调用,
- 异步调用不要等待结果的返回就可以取执行下面的业务逻辑
- 同步调用反之要等待结果的返回才可以取执行下面的业务逻辑
一般使用异步操作都会创建一个线程,放入线程池中去执行
具体实现方式如下:
首先在SpringBoot启动类打开异步
@SpringBootApplication
@EnableAsync // 打开异步
public class SpringBootWebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args);
}
}
定义异步方法业务逻辑,注意:定义的义务方法本类中调用不起作用
/**
* spring业务异步 注:本类不起作用
*/
@Async
public void log() {
System.err.println(Thread.currentThread().getName());
}
在需要调用的地方使用
/**
* 异步
*/
@GetMapping("/hello4")
public String hello4(){
main.log();
System.out.println("嗨");
return "hello4";
}
可以自己配置线程池,(如果不自定义会在默认线程池执行)
@Configuration
@ConfigurationProperties(prefix = "spring.task.pool")
@Data
public class TaskThreadPoolConfig {
private int corePoolSize = 5;
private int maxPoolSize = 50;
private int keepAliveSeconds = 60;
private int queueCapacity = 10000;
private String threadNamePrefix = "AsyncTask=";
}
通过SpringBoot配置
@Configuration
public class AsyncTaskExecutePool implements AsyncConfigurer {
private Logger logger = LoggerFactory.getLogger(AsyncTaskExecutePool.class);
@Autowired
private TaskThreadPoolConfig config;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(config.getCorePoolSize());
executor.setMaxPoolSize(config.getMaxPoolSize());
executor.setQueueCapacity(config.getQueueCapacity());
executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
executor.setThreadNamePrefix(config.getThreadNamePrefix());
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 策略
executor.initialize();
return executor;
}
这样就可以了