欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot利用@Async異步調用:使用Future及定義超時詳解

 更新時間:2018年05月02日 10:48:49   作者:翟永超  
這篇文章主要給大家介紹了關于Spring Boot利用@Async異步調用:使用Future及定義超時的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友可以參考下

前言

之前連續(xù)寫了幾篇關于使用@Async實現異步調用的內容,也得到不少童鞋的反饋,其中問題比較多的就是關于返回Future的使用方法以及對異步執(zhí)行的超時控制,所以這篇就來一起講講這兩個問題的處理。

如果您對于@Async注解的使用還不了解的話,可以看看之前的文章,具體如下:

定義異步任務

首先,我們先使用@Async注解來定義一個異步任務,這個方法返回Future類型,具體如下:

@Slf4j
@Component
public class Task {
 public static Random random = new Random();
 @Async("taskExecutor")
 public Future<String> run() throws Exception {
  long sleep = random.nextInt(10000);
  log.info("開始任務,需耗時:" + sleep + "毫秒");
  Thread.sleep(sleep);
  log.info("完成任務");
  return new AsyncResult<>("test");
 }
}

Tips:什么是Future類型?

Future是對于具體的Runnable或者Callable任務的執(zhí)行結果進行取消、查詢是否完成、獲取結果的接口。必要時可以通過get方法獲取執(zhí)行結果,該方法會阻塞直到任務返回結果。

它的接口定義如下:

public interface Future<V> {
 boolean cancel(boolean mayInterruptIfRunning);
 boolean isCancelled();
 boolean isDone();
 V get() throws InterruptedException, ExecutionException;
 V get(long timeout, TimeUnit unit)
  throws InterruptedException, ExecutionException, TimeoutException;
}

它聲明這樣的五個方法:

  • cancel方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。參數mayInterruptIfRunning表示是否允許取消正在執(zhí)行卻沒有執(zhí)行完畢的任務,如果設置true,則表示可以取消正在執(zhí)行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執(zhí)行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false,則返回false;如果任務還沒有執(zhí)行,則無論mayInterruptIfRunning為true還是false,肯定返回true。
  • isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。
  • isDone方法表示任務是否已經完成,若任務完成,則返回true;
  • get()方法用來獲取執(zhí)行結果,這個方法會產生阻塞,會一直等到任務執(zhí)行完畢才返回;
  • get(long timeout, TimeUnit unit)用來獲取執(zhí)行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。

也就是說Future提供了三種功能:

  1. 判斷任務是否完成;
  2. 能夠中斷任務;
  3. 能夠獲取任務執(zhí)行結果。

測試執(zhí)行與定義超時

在完成了返回Future的異步任務定義之后,我們來嘗試實現一個單元測試來使用這個Future完成任務的執(zhí)行,比如:

@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ApplicationTests {
 @Autowired
 private Task task;
 @Test
 public void test() throws Exception {
  Future<String> futureResult = task.run();
  String result = futureResult.get(5, TimeUnit.SECONDS);
  log.info(result);
 }
}

上面的代碼中,我們在get方法中還定義了該線程執(zhí)行的超時時間,通過執(zhí)行這個測試我們可以觀察到執(zhí)行時間超過5秒的時候,這里會拋出超時異常,該執(zhí)行線程就能夠因執(zhí)行超時而釋放回線程池,不至于一直阻塞而占用資源。

完整示例:

讀者可以根據喜好選擇下面的兩個倉庫中查看Chapter4-1-4項目:

Github:https://github.com/dyc87112/SpringBoot-Learning/

Gitee:https://gitee.com/didispace/SpringBoot-Learning/

本地下載:http://xiazai.jb51.net/201805/yuanma/SpringBoot-Learning(jb51.net).rar

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • JVM內存模型/內存空間:運行時數據區(qū)

    JVM內存模型/內存空間:運行時數據區(qū)

    這篇文章主要介紹了JVM內存模型/內存空間的相關資料,幫助大家更好的理解和學習Java虛擬機,感興趣的朋友可以了解詳細,希望能夠給你帶來幫助
    2021-08-08
  • springboot基于IDEA環(huán)境熱加載與熱部署教程

    springboot基于IDEA環(huán)境熱加載與熱部署教程

    這篇文章主要為大家介紹了springboot在IDEA環(huán)境下的熱加載與熱部署教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • 詳解Java中的線程模型與線程調度

    詳解Java中的線程模型與線程調度

    這篇文章主要介紹了詳解Java中的線程模型與線程調度的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • java8 利用reduce實現將列表中的多個元素的屬性求和并返回操作

    java8 利用reduce實現將列表中的多個元素的屬性求和并返回操作

    這篇文章主要介紹了java8 利用reduce實現將列表中的多個元素的屬性求和并返回操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring框架學習之AOP詳解

    Spring框架學習之AOP詳解

    這篇文章主要介紹了Spring框架學習之AOP詳解,文中有非常詳細的代碼示例,對正在學習Spring框架的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • java?LeetCode普通字符串模擬題解示例

    java?LeetCode普通字符串模擬題解示例

    這篇文章主要為大家介紹了java?LeetCode普通字符串模擬題解示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java?List集合取交集的8種不同實現方式總結

    Java?List集合取交集的8種不同實現方式總結

    工作中經常遇到需要取兩個集合之間的交集、差集情況,下面這篇文章主要給大家總結介紹了關于Java?List集合取交集的8種不同實現方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • JAVA面向對象設計寵物類方式

    JAVA面向對象設計寵物類方式

    本指南涉及JAVA面向對象的寵物類設計,包括寵物類的父類及其子類小貓類和小狗類,用戶可以選擇養(yǎng)貓或養(yǎng)狗,給寵物起名字,實現喂食互動,同時寵物具有飽食度和快樂度屬性,適合初學者學習面向對象設計
    2024-10-10
  • 簡單了解java類型轉換常見的錯誤

    簡單了解java類型轉換常見的錯誤

    這篇文章主要介紹了簡單了解java類型轉換常見的錯誤,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java使用HttpClient實現Post請求實例

    Java使用HttpClient實現Post請求實例

    本篇文章主要介紹了Java使用HttpClient實現Post請求實例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論