分為三步
- 啟動類加 @EnableAsync 註解
- 在方法上加 @Async 註解
- 建立執行緒池配置類
1.啟動類加 @EnableAsync 註解
@SpringBootApplication
@EnableAsync
public class FacadeH5Application {
public static void main(String[] args) {
SpringApplication.run(FacadeH5Application.class, args);
}
}
2.在方法上加 @Async 註解
@Async
public void m1() {
//do something
}
注意:導致 @Async 註解失效的幾個原因
- 兩個方法都在同一個類裡面,一個方法呼叫另一個非同步方法,不生效。但是如果在本類中注入自己的例項,再透過自己的例項呼叫非同步方法就可行。
- @Async 方法所在的類沒有交給 spring 代理(沒加諸如@Component註解),不生效。
- 註解的方法不是是public方法,不生效。
3.建立執行緒池配置類
預設的執行緒池配置如下
# 核心執行緒數
spring.task.execution.pool.core-size=8
# 最大執行緒數
spring.task.execution.pool.max-size=16
# 空閒執行緒存活時間
spring.task.execution.pool.keep-alive=60s
# 是否允許核心執行緒超時
spring.task.execution.pool.allow-core-thread-timeout=true
# 執行緒佇列數量
spring.task.execution.pool.queue-capacity=100
# 執行緒關閉等待
spring.task.execution.shutdown.await-termination=false
spring.task.execution.shutdown.await-termination-period=
# 執行緒名稱字首
spring.task.execution.thread-name-prefix=task-
建立執行緒池配置類
@Configuration
public class ThreadPoolConfig {
@Bean
public TaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//設定核心執行緒數
executor.setCorePoolSize(10);
//設定最大執行緒數
executor.setMaxPoolSize(20);
//設定佇列容量
executor.setQueueCapacity(20);
//設定執行緒活躍時間
executor.setKeepAliveSeconds(30);
//設定執行緒名稱字首
executor.setThreadNamePrefix("sendSms-");
//設定拒絕策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//等待所有任務結束後再關閉執行緒池
executor.setWaitForTasksToCompleteOnShutdown(true);
//設定執行緒池中任務的等待時間
executor.setAwaitTerminationSeconds(60);
return executor;
}
}
配置多個執行緒池
有時候,一個專案中如果配置了多個執行緒池,那需要在 @Bean後面加上執行緒池的名稱
@Configuration
public class ThreadPoolConfig {
@Bean("ThreadPool1")
public TaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
......
return executor;
}
@Bean("ThreadPool2")
public TaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
......
return executor;
}
}
在使用 @Async註解時就需要指明具體使用的執行緒池,如下格式
@Async("ThreadPool1")
public void m1() {
//do something
}