成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

前言

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括順昌網(wǎng)站建設(shè)、順昌網(wǎng)站制作、順昌網(wǎng)頁(yè)制作以及順昌網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,順昌網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到順昌省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

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

  • 使用@Async實(shí)現(xiàn)異步調(diào)用
  • 使用@Async實(shí)現(xiàn)異步調(diào)用:自定義線程池
  • 使用@Async實(shí)現(xiàn)異步調(diào)用:資源優(yōu)雅關(guān)閉

定義異步任務(wù)

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

Tips:什么是Future類型?

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

它的接口定義如下:

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;
}

它聲明這樣的五個(gè)方法:

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

也就是說(shuō)Future提供了三種功能:

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

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

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

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

完整示例:

讀者可以根據(jù)喜好選擇下面的兩個(gè)倉(cāng)庫(kù)中查看Chapter4-1-4項(xiàng)目:

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

分享題目:SpringBoot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解
網(wǎng)頁(yè)地址:http://jinyejixie.com/article34/ggeepe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、電子商務(wù)全網(wǎng)營(yíng)銷推廣、小程序開(kāi)發(fā)、App開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
荔波县| 穆棱市| 策勒县| 澄迈县| 奎屯市| 白朗县| 环江| 巫山县| 亚东县| 札达县| 安远县| SHOW| 井研县| 镇康县| 龙海市| 阿克苏市| 娄底市| 交城县| 大冶市| 民丰县| 乌兰浩特市| 社会| 天台县| 曲阜市| 宁陕县| 耿马| 武乡县| 汉沽区| 曲阳县| 衡水市| 延寿县| 陈巴尔虎旗| 从江县| 龙山县| 婺源县| 即墨市| 婺源县| 宁蒗| 乃东县| 利津县| 宜兰县|