我們在項目中,經常會遇到異步調用的問題,異步調用的效果就是主線程可以提前返回,然後交由任務子線程進行處理。在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();異步方法。
執行結果: