Spring 非同步執行緒池的使用
阿新 • • 發佈:2019-02-26
只需要建立一個 Java 配置類, 實現 AsyncConfigurer 介面, 實現 getAsyncExecutor 方法返回執行緒池. 在 java 配置檔案類上加註解 @EnableAsync 開啟非同步可用, 然後就可以在 service 方法上使用註解 @Async 使用非同步呼叫
1. 建立一個 java 配置類檔案.
package com.codingos.springboot.test.config; import java.util.concurrent.Executor; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { /** * 定義執行緒池 */ @Override public Executor getAsyncExecutor() { // 定義執行緒池 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); // 設定核心執行緒 taskExecutor.setCorePoolSize(10); // 設定最大執行緒 taskExecutor.setMaxPoolSize(30); // 設定執行緒佇列最大執行緒數 taskExecutor.setQueueCapacity(2000); // 初始化 taskExecutor.initialize(); return taskExecutor; } }
2. 建立非同步服務 service
package com.codingos.springboot.test.service.impl; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.codingos.springboot.test.service.AsyncService; @Service public class AsyncServiceImpl implements AsyncService { @Override @Async // 宣告使用非同步呼叫 public void generateReport() { // 列印當前非同步執行緒名稱 System.out.println("報表執行緒名稱" + Thread.currentThread().getName()); } }
然後就可以在 controller 中呼叫了
要注意的是:非同步配置檔案類上要使用 @EnableAsync 註解,非同步 service 的方法上使用 @Async 註解