Spring Boot使用Spring的非同步執行緒池的實現
前言
執行緒池,從名字上來看,就是一個儲存執行緒的"池子",凡事都有其道理,那執行緒池的好處在哪裡呢?
我們要讓計算機為我們幹一些活,其實都是在使用執行緒,使用方法就是new一個Runnable
介面或者新建一個子類,繼承於Thread
類,這就會涉及到執行緒物件的建立與銷燬,這兩個操作無疑是耗費我們系統處理器資源的,那如何解決這個問題呢? 執行緒池其實就是為了解決這個問題而生的。
執行緒池提供了處理系統性能和大使用者量請求之間的矛盾的方法,通過對多個任務重用
已經存在的執行緒物件,降低了對執行緒物件建立和銷燬的開銷,由於當客戶請求到了時,執行緒物件已經存在
,可以提高請求的響應時間從而整體的提高了系統服務的表現。
本篇部落格就是要總結一下,如何在Spring中使用非同步執行緒池,給大家一個例子,去體會一下非同步這個概念
實習生小王負責後臺管理系統的報表分析,他的工作是負責操作後臺系統,點選按鈕,生成資料報表,而並不需要檢視報表,由於資料量大, 生成報表需要花費很長時間,而如果生成報表和其他工作在一個執行緒,小王就無法幹其他工作了,所以需要將生成報表這個任務交給計算機的其他執行緒,這便是非同步的體現。
在Spring中使用非同步執行緒池
spring中提供了AsyncConfigurer
這個配置介面,便於我們配置自己的非同步執行緒池。
新建非同步配置類
我習慣新建一個config包,然後將一些元件的配置類都放到裡面
package com.example.wyh.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; /** * @author 陽光大男孩!!! */ @Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { //定義執行緒池 ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); //設定核心執行緒數 threadPoolTaskExecutor.setCorePoolSize(10); //設定執行緒池最大執行緒數 threadPoolTaskExecutor.setMaxPoolSize(30); //設定執行緒佇列最大執行緒數 threadPoolTaskExecutor.setQueueCapacity(2000); //初始化執行緒池 threadPoolTaskExecutor.initialize(); return threadPoolTaskExecutor; } }
在上面程式碼中,我們使用@Configuration
告訴spring這是一個配置類,使用註解@EnableAsync
讓spring開啟非同步可用。 這樣以後如果想把某個方法中的任務非同步地放到另外一個執行緒,只需要通過方法上加 @Async
註解即可。
新建一個服務介面,並實現
package com.example.wyh.Service; /** * @author 陽光大男孩!!! */ public interface AsyncService { /** * 測試使用非同步執行緒池來執行工作 */ public void useAsyncThreadWork(); }
package com.example.wyh.Service; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; /** * @author 陽光大男孩!!! */ @Service public class AsyncServiceImp implements AsyncService{ @Override @Async public void useAsyncThreadWork() { System.out.println(Thread.currentThread().getName()); } }
在介面的具體實現中,我們列印了當前執行緒的名稱,藉以來檢視是否是在一個心的執行緒中執行該任務。並且通過@Service
註解告訴spring這是一個Service型別的bean,這樣我們就可以讓spring通過其自身容器來管理我們的物件,這就是IOC
特性的一個體現。
新建一個Controller 進行訪問、測試
/** * @author 陽光大男孩!!! */ @RestController public class AsyncController { @Autowired AsyncService asyncService; @GetMapping("/testAsync") public String testAsync() { System.out.println(Thread.currentThread().getName()); asyncService.useAsyncThreadWork(); return "testAsync方法執行成功..."; } }
可以看到,在上述程式碼中,我們使用 @Autowired
註解自動裝配了剛才交給Spring容器管理的Service
實現類物件,這是spring 的DI
特性體現。
由於我開的是8090埠,所以我訪問的是8090埠
可以看到列印了兩個執行緒的名稱,第一個是在Controller中執行的執行緒名稱,第二個則是spring通過我們剛才的配置,為我們從執行緒池中提取的執行緒併為我們執行相應任務。
總結
本篇部落格簡介了在spring中使用執行緒池非同步執行任務的基本方法,為在專案中使用非同步執行緒池提供了示例。
到此這篇關於Spring Boot使用Spring的非同步執行緒池的實現的文章就介紹到這了,更多相關Spring Boot 非同步執行緒池內容請搜素我們以前的文章或下面相關文章,希望大家以後多多支援我們!