SpringBoot - 第三十六章 | @Async 實現異步調用:使用Future以及定義超時
在前面已經閱讀研究了幾篇關於使用@Async
實現異步調用的內容,雖然多數都是參考別人的文章,但是自己動手做實踐才是最重要的,這邊又參考了一篇使用Future以及定義超時。
關於@Async
註解,可以看看之前的文章:
SpringBoot - 第三十三章 | @Async 實現異步調用
SpringBoot - 第三十四章 | @Async 實現異步調用:自定義線程池
SpringBoot - 第三十五章 | @Async 實現異步調用:ThreadPoolTaskScheduler線程池的優雅關閉
這邊繼續沿用 chapter33 的專案來做範例。
什麼是Future?
1 | * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. |
在上面的註釋中我們能知道Future用來代表異步的結果,對於具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果的接口。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。簡而言之就是提供一個異步運算結果的一個建模。它可以讓我們把耗時的操作從我們本身的調用線程中釋放出來,只需要完成後再進行回調。就好像我們去飯店裡面吃飯,不需要你去煮飯,而你這個時候可以做任何事,然後飯煮好後就會回調你去吃。
- 共聲明五個方法:
方法 | 說明 |
---|---|
cancel | 方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false ,則返回false;如果任務還沒有執行,則無論mayInterruptIfRunning為true還是false,肯定返回true。 |
isCancelled | 方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。 |
isDone | 方法表示任務是否已經完成,若任務完成,則返回true; |
get() | 方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回; |
get(long timeout, TimeUnit unit) | 用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。 |
總結Future提供了三種功能,判斷任務是否完成、能夠中斷任務、能夠獲取任務執行結果。
什麼是CompletableFuture?
CompletableFuture是JDK8提出的一個支持非阻塞的多功能的Future,同樣也是實現了Future接口。
修改 CompleteAsyncTask
建立 測試案例
測試結果
執行在五秒內
執行超過五秒
我們在get方法中還定義了該線程執行的超時時間,通過執行這個測試我們可以觀察到執行時間超過5秒的時候,這裡會拋出超時異常,該執行線程就能夠因執行超時而釋放迴線程池,不至於一直阻塞而佔用資源。
註:以上參考了
异步技巧之CompletableFuture
程序猿DD 的 Spring Boot使用@Async实现异步调用:使用Future以及定义超时 文章。