国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

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

2024-07-14 08:40:34
字體:
來源:轉載
供稿:網友

前言

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

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

定義異步任務

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

@Slf4j@Componentpublic 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任務的執行結果進行取消、查詢是否完成、獲取結果的接口。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。

它的接口定義如下:

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表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置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提供了三種功能:

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

測試執行與定義超時

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

@Slf4j@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTestpublic 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方法中還定義了該線程執行的超時時間,通過執行這個測試我們可以觀察到執行時間超過5秒的時候,這里會拋出超時異常,該執行線程就能夠因執行超時而釋放回線程池,不至于一直阻塞而占用資源。

完整示例:

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

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

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

總結

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深州市| 东莞市| 公安县| 改则县| 施秉县| 南康市| 西峡县| 县级市| 碌曲县| 桓台县| 武宣县| 东辽县| 桂林市| 淮南市| 集安市| 青神县| 应城市| 台前县| 通海县| 北流市| 班玛县| 板桥市| 北安市| 抚州市| 尼玛县| 锡林浩特市| 浙江省| 左贡县| 利川市| 浦县| 阿拉善右旗| 嘉义县| 八宿县| 木里| 财经| 北海市| 惠州市| 静乐县| 屯门区| 千阳县| 溧阳市|