Spring Boot對Future模式的支持詳解
前言
我們在實際項目中有些復雜運算、耗時操作,就可以利用多線程來充分利用CPU,提高系統(tǒng)吞吐量。SpringBoot對多線程支持非常好,對我們的開發(fā)非常便捷。
Future模式是多線程開發(fā)中非常常見的一種設計模式。核心思想是異步調用。當我們執(zhí)行一個方法時,方法中有多個耗時任務需要同時去做,而且又不著急等待這個結果時可以讓客戶端立即返回然后,后臺慢慢去計算任務。
當我們做一件事的時候需要等待,那么我們就可以在這個等待時間內來去做其它事情,這樣就可以充分利用時間。比如我們點外賣,需要一段時間,那么我們在等外賣的時間里可以看點書,看個電影。這就是典型的Future模式。如果是普通模式的話,就是等外賣的時候就等外賣,外賣到了后再去看書,極大的浪費時間。
SpringBoot對Future模式支持非常好,只需要簡單的代碼就能實現(xiàn)。
1.Future的相關方法
- boolean cancel(boolean mayInterruptIfRunning);//可以在任務執(zhí)行過程中取消任務
- boolean isCancelled();//判斷Future任務是否取消
- boolean isDone();//判斷任務是否完成
- V get();//獲取任務最終結果,這是一個阻塞方法,會等待任務執(zhí)行好才會執(zhí)行后面的代碼
- V get(long timeout, TimeUnit unit);//有等待時常的get方法,等待時間到了后仍然沒有計算完成,則拋異常
2.需要的注解
springboot 配置多線程需要兩個注解
1、@EnableAsync
在配置類中通過加@EnableAsync開啟對異步任務的支持
2、@Async
在需要執(zhí)行的方法上加@Async表明該方法是個異步方法,如果加在類級別上,則表明類所有的方法都是異步方法
3.配置代碼
@Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); //核心線程數(shù) taskExecutor.setCorePoolSize(8); //最大線程數(shù) taskExecutor.setMaxPoolSize(16); //隊列大小 taskExecutor.setQueueCapacity(100); taskExecutor.initialize(); return taskExecutor; } }
4.FutureService
@Service public class FutureService { @Async public Future<String> futureTest() throws InterruptedException { System.out.println("任務執(zhí)行開始,需要:1000ms"); for (int i = 0; i < 10; i++) { Thread.sleep(100); System.out.println("do:" + i); } System.out.println("完成任務"); return new AsyncResult<>(Thread.currentThread().getName()); } }
【注】這里的方法自動被注入使用上文配置的ThreadPoolTaskExecutor
5.測試代碼
@Resource private FutureService futureService; @Test public void futureTest() throws InterruptedException, ExecutionException { long start = System.currentTimeMillis(); System.out.println("開始"); //耗時任務 Future<String> future = futureService.futureTest(); //另外一個耗時任務 Thread.sleep(500); System.out.println("另外一個耗時任務,需要500ms"); String s = future.get(); System.out.println("計算結果輸出:" + s); System.out.println("共耗時:" + (System.currentTimeMillis() - start)); }
6.運行結果
開始
2019-01-07 23:50:34.726 INFO 14648 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
任務執(zhí)行開始,需要:1000ms
do:0
do:1
do:2
do:3
另外一個耗時任務,需要500ms
do:4
do:5
do:6
do:7
do:8
do:9
完成任務
計算結果輸出:ThreadPoolTaskExecutor-1
共耗時:1016Process finished with exit code 0
本來需要至少1500ms 執(zhí)行的任務現(xiàn)在只需要1016ms,因為在執(zhí)行耗時任務1的同時也在執(zhí)行耗時任務2,兩個任務并行執(zhí)行,這就是future模式的好處,在等待時間內去執(zhí)行其它任務,能夠充分利用時間
【注】本文基于SpringBoot 2.0
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Java Vector實現(xiàn)班級信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了Java Vector實現(xiàn)班級信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02@PostConstruct在項目啟動時被執(zhí)行兩次或多次的原因及分析
這篇文章主要介紹了@PostConstruct在項目啟動時被執(zhí)行兩次或多次的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08基于java實現(xiàn)websocket協(xié)議過程詳解
這篇文章主要介紹了基于java實現(xiàn)websocket協(xié)議過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09SpringMVC中controller接收json數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了SpringMVC中controller接收json數(shù)據(jù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09java.lang.NoClassDefFoundError錯誤的原因及解決方法
這篇文章主要給大家介紹了關于java.lang.NoClassDefFoundError錯誤的原因及解決的相關資料,java.lang.NoClassDefFoundError是Java虛擬機在運行時無法找到特定類的錯誤,需要的朋友可以參考下2023-10-10Spring創(chuàng)建bean對象三種方式代碼實例
這篇文章主要介紹了Spring創(chuàng)建bean對象三種方式代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07