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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

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

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

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

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

前言

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

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

定義異步任務(wù)

首先,我們先使用@Async注解來定義一個異步任務(wù),這個方法返回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("開始任務(wù),需耗時:" + sleep + "毫秒");
  Thread.sleep(sleep);
  log.info("完成任務(wù)");
  return new AsyncResult<>("test");
 }
}

Tips:什么是Future類型?

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

它的接口定義如下:

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

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

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

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

在完成了返回Future的異步任務(wù)定義之后,我們來嘗試實(shí)現(xiàn)一個單元測試來使用這個Future完成任務(wù)的執(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項(xiàng)目:

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

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

總結(jié)

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产123区| 亚洲精品影视 | 妹妹你插的我好爽 | ysl千人千色t9t9t9 | 性色xxx| 瘦老汉gay | 免费视屏 | 久久精品视频免费 | 99在线在线视频免费视频观看 | 国内会所按摩推拿国产 | 精品日韩一区二区三区 | 大学生初次破苞免费视频 | haodiaocao的视频这里看 | 手机看片国产免费现在观看 | 国产外围 | 特级www| 国产三级跑 | 白白国产永久免费视频 | 清纯唯美 亚洲 | 亚洲、国产综合视频 | 范冰冰上面好大下面好紧 | 国产福利在线观看永久视频 | 好姑娘在线视频观看免费 | 日本在线视| www免费插插视频 | 草草草视频在线观看 | 成人在线免费观看 | 日本成人免费在线视频 | swag最新正在播放 | 222aaa精品影院 | 精品国产成人AV在线看 | 四虎地址 | 手机在线观看精品国产片 | 九九精品国产 | 手机能看的黄色网站 | 成年人免费在线看的惊悚动作片 | 逼中极品| 星空无限传媒xk8027穆娜 | 亚洲国产欧美目韩成人综合 | 国产第一综合另类色区奇米 | 亚洲国产日韩制服在线观看 |