一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Boot利用@Async異步調(diào)用:使用Future及定義超時詳解

Spring Boot利用@Async異步調(diào)用:使用Future及定義超時詳解

2021-04-25 11:43翟永超 Java教程

這篇文章主要給大家介紹了關于Spring Boot利用@Async異步調(diào)用:使用Future及定義超時的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友可以參考下

前言

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

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

定義異步任務

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@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í)行結果,該方法會阻塞直到任務返回結果。

它的接口定義如下:

?
1
2
3
4
5
6
7
8
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。參數(shù)mayInterruptIfRunning表示是否允許取消正在執(zhí)行卻沒有執(zhí)行完畢的任務,如果設置true,則表示可以取消正在執(zhí)行過程中的任務。如果任務已經(jīng)完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經(jīng)完成的任務會返回false;如果任務正在執(zhí)行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false,則返回false;如果任務還沒有執(zhí)行,則無論mayInterruptIfRunning為true還是false,肯定返回true。
  • isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。
  • isDone方法表示任務是否已經(jīng)完成,若任務完成,則返回true;
  • get()方法用來獲取執(zhí)行結果,這個方法會產(chǎn)生阻塞,會一直等到任務執(zhí)行完畢才返回;
  • get(long timeout, TimeUnit unit)用來獲取執(zhí)行結果,如果在指定時間內(nèi),還沒獲取到結果,就直接返回null。

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@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í)行超時而釋放回線程池,不至于一直阻塞而占用資源。

完整示例:

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

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

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

總結

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

原文鏈接:http://blog.didispace.com/springbootasync-4/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.片| 天海翼最新作品 | 男女男精品视频免费观看 | 欧美一级片免费 | 金莲你下面好紧夹得我好爽 | 操出水视频 | 精品视频免费在线 | 99精品免费观看 | 国产99区 | 99热精品在线播放 | 久久精品一卡二卡三卡四卡视频版 | 欧美日韩国产一区二区三区在线观看 | 免费国产午夜高清在线视频 | 色ccc36| 四虎黄色影视 | 91极品在线观看 | 动漫美女强行被吸乳做羞羞事 | 日本高清视频一区二区 | 色综合网亚洲精品久久 | 欧美极品brazzers 高清 | 美女天天操| 欧美特黄一级大片 | 日本wwxx护士 | 粗又长好猛好爽视频 | 人人擦| 国产一久久香蕉国产线看观看 | avove本人照片 | 青青精品 | 精品一区二区三区高清免费不卡 | 国产精品色拉拉免费看 | 四虎永久免费地址在线观看 | 成人天堂入口网站 | 免费观看日本视频 | 1769在线观看| 我的妹妹最近有点怪免费播放 | 99免费精品 | 色戒完整版2小时38分钟 | 四虎影院在线免费播放 | 亚洲精品第一国产综合高清 | 日韩欧美亚洲国产高清在线 | 91麻豆精品国产片在线观看 |