關於非同步任務,多執行緒@EnableAsync@Async
阿新 • • 發佈:2021-01-04
技術標籤:Spring
spring中有十分優秀的支援,就是註解@EnableAsync就可以使用多執行緒,@Async加線上程任務的方法上(需要非同步執行的任務),定義一個執行緒任務,通過spring提供的ThreadPoolTaskExecutor就可以使用執行緒池
首先定義配置類
這個配置類需要實現AsyncConfiguer介面,並實現它的方法
- 非同步執行緒的執行者,在裡面配置自動執行的東西,比如執行緒池引數
- 執行緒異常處理
package ds.watsons.app.label.config; import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configurable @EnableAsync public class TreadPoolConfigTest implements AsyncConfigurer{ @Override public Executor getAsyncExecutor() { // TODO Auto-generated method stub ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心執行緒池數量,方法: 返回可用處理器的Java虛擬機器的數量。 executor.setCorePoolSize(Runtime.getRuntime().availableProcessors()); //最大執行緒數量 executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*5); //執行緒池的佇列容量 executor.setQueueCapacity(Runtime.getRuntime().availableProcessors()*2); //執行緒名稱的字首 executor.setThreadNamePrefix("this-excutor-"); // setRejectedExecutionHandler:當pool已經達到max size的時候,如何處理新任務 // CallerRunsPolicy:不在新執行緒中執行任務,而是由呼叫者所在的執行緒來執行 //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } /*非同步任務中異常處理*/ @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { // TODO Auto-generated method stub return new SimpleAsyncUncaughtExceptionHandler(); } }
- 執行緒任務類
package ds.watsons.app.label.service; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @Component public class TreadTasks { @Async public void startMyTreadTask() { System.out.println("this is my async task"); } }
- 呼叫非同步執行緒任務
package ds.watsons.app.label.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import ds.watsons.app.label.service.TreadTasks; @Controller public class AsyncTaskUse { @Autowired private TreadTasks treadTasks; @GetMapping("/startMysync") public void useMySyncTask() { treadTasks.startMyTreadTask(); } }
請求url
/startMysync
返回結果:
this is my async task