精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java中使用CompletableFuture處理異步超時

開發 后端
一天,我在改進多線程代碼時被Future.get()卡住了。

一天,我在改進多線程代碼時被Future.get()卡住了。

Java中使用CompletableFuture處理異步超時

public void serve() throws InterruptedException, ExecutionException, TimeoutException {
  final Future<Response> responseFuture = asyncCode();
  final Response response = responseFuture.get(1, SECONDS);
  send(response);
}
private void send(Response response) {
  //...
}

這是用Java寫的一個Akka應用程序,使用了一個包含1000個線程的線程池(原來如此!)——所有的線程都在阻塞在這個 get() 中。系統的處理速度跟不上并發請求的數量。重構以后,我們干掉了所有的這些線程僅保留了一個,極大的減少了內存的占用。我們簡單一點,通過一個Java 8的例子來演示。***步是使用CompletableFuture來替換簡單的Future(見:Tip 9)。

  • 通過控制任務提交到ExecutorService的方式:只需用 CompletableFuture.supplyAsync(…, executorService) 來代替 executorService.submit(…) 即可
  • 處理基于回調函數的API:使用promises

否則(如果你已經使用了阻塞式的API或 Future<T>)會導致很多線程被阻塞。這就是為什么現在這么多異步的API都讓人很煩了。所以,讓我們重寫之前的代碼來接收CompletableFuture:

public void serve() throws InterruptedException, ExecutionException, TimeoutException {
    final CompletableFuture<Response> responseFuture = asyncCode();
    final Response response = responseFuture.get(1, SECONDS);
    send(response);
}

很明顯,這不能解決任何問題,我們還必須利用新的風格來編程:

public void serve() {
    final CompletableFuture<Response> responseFuture = asyncCode();
    responseFuture.thenAccept(this::send);
}

這個功能上是等同的,但是 serve() 只會運行一小段時間(不會阻塞或等待)。只需要記?。簍his::send 將會在完成 responseFuture 的同一個線程內執行。如果你不想花費太大的代價來重載已經存在的線程池或send()方法,可以考慮通過 thenAcceptAsync(this::send, sendPool) 好極了,但是我們失去了兩個重要屬性:異常傳播與超時。異常傳播很難實現,因為我們改變了API。當serve()存在的時候,異步操作可能還沒有完成。 如果你關心異常,可以考慮返回 responseFutureor 或者其他可選的機制。至少,應該有異常的日志,否則該異常就會被吞噬了。

final CompletableFuture<Response> responseFuture = asyncCode();
responseFuture.exceptionally(throwable -> {
    log.error("Unrecoverable error", throwable);
    return null;
});

請小心上面的代碼:exceptionally() 試圖從失敗中恢復過來,返回一個可選的結果。這個地方雖可以正常的工作,但是如果對 exceptionally()和withthenAccept() 使用鏈式調用,即使失敗了也還是會調用 send() 方法,返回一個null參數,或者任何其它從 exceptionally() 方法中返回的值。

responseFuture
    .exceptionally(throwable -> {
        log.error("Unrecoverable error", throwable);
        return null;
    })
    .thenAccept(this::send);  //probably not what you think

丟失一秒超時的問題非常巧妙。我們原始的代碼在Future完成之前最多等待(阻塞)1秒,否則就會拋出 TimeoutException。我們丟失了這個功能,更糟糕的是,單元測試超時的不是很方便,經常會跳過這個環節。為了維持超時機制,而又不破壞事件 驅動的原則,我們需要建立一個額外的模塊:一個在給定時間后必定會失敗的 Future。

public static <T> CompletableFuture<T> failAfter(Duration duration) {
    final CompletableFuture<T> promise = new CompletableFuture<>();
    scheduler.schedule(() -> {
        final TimeoutException ex = new TimeoutException("Timeout after " + duration);
        return promise.completeExceptionally(ex);
    }, duration.toMillis(), MILLISECONDS);
    return promise;
}

private static final ScheduledExecutorService scheduler =
        Executors.newScheduledThreadPool(
                1,
                new ThreadFactoryBuilder()
                        .setDaemon(true)
                        .setNameFormat("failAfter-%d")
                        .build());

這個很簡單:我們創建一個promise(沒有后臺任務或線程池的 Future),然后在給定的 java.time.Duration 之后會拋出 TimeoutException 異常。如果在某個地方調用 get() 獲取這個 Future,阻塞的時間到達這個指定的時間后會拋出 TimeoutException。

實際上,它是一個包裝了 TimeoutException 的 ExecutionException,這個無需多說。注意,我使用了固定一個線程的線程池。這不僅僅是為了教學的目的:這是“1個線程應當能滿足任何人 的需求”的場景。failAfter() 本身沒多大的用處,但是如果和 ourresponseFuture 一起使用,我們就能解決這個問題了。

final CompletableFuture<Response> responseFuture = asyncCode();
final CompletableFuture<Response> oneSecondTimeout = failAfter(Duration.ofSeconds(1));
responseFuture
        .acceptEither(oneSecondTimeout, this::send)
        .exceptionally(throwable -> {
            log.error("Problem", throwable);
            return null;
        });

這里還做了很多其他事情。在后臺的任務接收 responseFuture 時,我們也創建了一個“合成”的 oneSecondTimeout future,這在成功的時候永遠不會執行,但是在1秒后就會導致任務失敗?,F在我們聯合這兩個叫做 acceptEither,這個操作將執行先完成 Future 的代碼塊,而簡單的忽略 responseFuture 或 oneSecondTimeout 中運行比較慢的那個。如果 asyncCode() 代碼在1秒內執行完成,this::send 就會被調用,而 oneSecondTimeout 異常就不會拋出。但是,如果 asyncCode() 執行真的很慢,oneSecondTimeout 異常就先拋出。由于一個異常導致任務失敗,exceptionallyerror 處理器就會被調用,而不是 this::send 方法。你可以選擇執行 send() 或者 exceptionally,但是不能兩個都執行。當如,如果我們有兩個“普通”的 Future 正常執行完成了,則***響應的那個將調用 send() 方法,后面的就會被丟棄。

這個不是最清晰的解決方案。更清晰的方案是包裝原始的 Future,然后保證它能在給定的時間內執行。這種操作對 com.twitter.util.Future 是可行的(Scala叫做 within()),但是 scala.concurrent.Future 中沒有這個功能(據推測是為了鼓勵使用前面的方式)。我們暫時不討論Scala背后如何執行的,先實現類似 CompletableFuture 的操作。它接受一個 Future 作為輸入,然后返回一個 Future,這個 Future 在后臺任務完成時候執行完成。但是,如果底層的 Future 執行的時間太長,就或拋出異常:

public static <T> CompletableFuture<T> within(CompletableFuture<T> future, Duration duration) {
    final CompletableFuture<T> timeout = failAfter(duration);
    return future.applyToEither(timeout, Function.identity());
}

這引導我們實現最終的、清晰的、靈活的方法:

final CompletableFuture<Response> responseFuture = within(
        asyncCode(), Duration.ofSeconds(1));
responseFuture
        .thenAccept(this::send)
        .exceptionally(throwable -> {
            log.error("Unrecoverable error", throwable);
            return null;
        });

希望你喜歡這篇文章,因為你已經知道在Java里,實現響應式編程不再是什么問題。

責任編輯:王雪燕 來源: ImportNew
相關推薦

2024-12-26 12:59:39

2024-03-06 08:13:33

FutureJDKCallable

2021-03-22 08:45:30

異步編程Java

2021-02-21 14:35:29

Java 8異步編程

2021-06-06 16:56:49

異步編程Completable

2024-04-18 08:20:27

Java 8編程工具

2020-05-29 07:20:00

Java8異步編程源碼解讀

2024-10-14 08:29:14

異步編程任務

2024-08-06 09:43:54

Java 8工具編程

2025-02-06 16:51:30

2022-07-08 14:14:04

并發編程異步編程

2011-08-18 13:58:34

iPhone開發NSOperation異步

2024-02-07 11:44:20

NestJSRxJS異步編程

2017-12-21 15:48:11

JavaCompletable

2023-07-19 08:03:05

Future異步JDK

2024-09-10 09:05:12

SpringREST并發

2021-01-19 05:30:55

C# 8異步流IEnumerable

2023-04-13 07:33:31

Java 8編程工具

2024-01-11 12:14:31

Async線程池任務

2022-05-13 12:34:16

美團開發實踐
點贊
收藏

51CTO技術棧公眾號

欧美tickling挠脚心丨vk| 国产又大又长又粗| 免费观看成年在线视频网站| 国产精品毛片久久久久久久久久99999999| 色综合天天爱| 精品久久久久人成| 99久久久精品免费观看国产| 亚洲色图27p| 久久精品女人天堂av免费观看| 粉嫩av一区二区三区粉嫩| 视频在线观看99| 97xxxxx| 东京干手机福利视频| 91日韩欧美| 欧美午夜精品久久久久久超碰 | 国产a免费视频| av高清一区| 久久久精品影视| 国产91精品黑色丝袜高跟鞋| 中国极品少妇xxxx| 国产在线xxx| 国产成人精品亚洲日本在线桃色| 中日韩美女免费视频网站在线观看| 日本中文字幕片| 久久久久xxxx| av黄色一级片| 污污的视频在线观看| 老司机午夜免费精品视频| 亚洲国产成人久久综合一区| 国产真实老熟女无套内射| 精品国产九九九| 狂野欧美激情性xxxx欧美| 国产美女精品人人做人人爽| 亚洲美女精品成人在线视频| 国产精品免费入口| 特黄视频在线观看| 午夜亚洲影视| 欧美精品一区视频| 18视频在线观看娇喘| 超碰在线观看av| 久久se精品一区二区| 久久深夜福利免费观看| 午夜免费看毛片| 亚洲第一图区| 国产精品污www在线观看| 91情侣偷在线精品国产| 久久久久久久中文字幕| 欧美亚洲国产日韩| 欧美日韩中文另类| 大胆欧美熟妇xx| 天天操天天干天天爽| 国产传媒一区在线| 69174成人网| 日韩精品手机在线| 成人免费av| 日韩欧美你懂的| 国产精品丝袜久久久久久消防器材| 午夜影院免费在线| 亚洲黄色小视频| 欧美亚洲免费在线| www.亚洲激情| 国产精品大片| 亚洲视频网站在线观看| 91大神免费观看| www.综合| 久久久久性色av无码一区二区| 日韩黄色碟片| 亚洲国产日日夜夜| 日韩久久在线| 成人免费公开视频| 成人一二三区视频| 国产精品免费福利| 在线看成人av| 欧美大人香蕉在线| 久久精品视频中文字幕| 精品人妻一区二区三区日产乱码卜| 精品三区视频| 6080日韩午夜伦伦午夜伦| 日韩少妇内射免费播放18禁裸乳| 嗯~啊~轻一点视频日本在线观看| 亚洲va欧美va国产va天堂影院| 亚洲欧洲一区二区福利| 色一情一乱一乱一区91av| www.亚洲精品| 精品久久久久久久久久久下田 | 另类成人小视频在线| 欧美激情在线播放| 卡一卡二卡三在线观看| 国产在线视频欧美一区| 91黄色激情网站| 国产精品国产对白熟妇| 一二三四视频在线中文| 一区二区三区在线视频观看58| www.好吊操| 免费福利视频一区二区三区| 亚洲成人资源在线| 男人舔女人下面高潮视频| 9765激情中文在线| 亚洲久草在线视频| 日本免费在线视频观看| 国产毛片在线| jizz在线免费观看| 女人天堂亚洲aⅴ在线观看| 亚洲一二在线观看| 素人fc2av清纯18岁| av男人一区| 欧美变态凌虐bdsm| 91成年人网站| 欧美日韩123| 亚洲美女久久久| 黄色a级片在线观看| 91视频综合| 韩日欧美一区二区| 全部毛片永久免费看| 91久久亚洲| 欧美激情xxxxx| 免费在线观看av网址| 自拍日韩欧美| 欧美日韩国产成人高清视频| 校园春色 亚洲| 久久久久99| 欧美日韩伊人| 欧美日韩成人激情| 91制片厂毛片| 玖玖精品在线| 91精品中文字幕一区二区三区| 久久久久久久无码| 任你弄精品视频免费观看| www亚洲欧美| 青青草成人免费| 日韩av一区二区三区四区| 国产精品女主播视频| 色婷婷av一区二区三区之红樱桃 | 日韩精品一区二区三区在线观看| a天堂中文字幕| 日本高清免费电影一区| 97视频在线播放| 亚洲av无码一区二区三区dv| www欧美在线观看| 日本久久一二三四| 色综久久综合桃花网| 精品黑人一区二区三区| 免费观看日韩av| 亚洲xxxx做受欧美| 免费av网站在线看| 亚洲一区二区在线视频| 黄色一级在线视频| 99re66热这里只有精品4| 亚洲激情视频在线播放| 国产三级短视频| 日韩av一区二区三区| 日韩尤物视频| 成人全视频在线观看在线播放高清 | 日韩大尺度黄色| 日韩高清欧美高清| 极品色av影院| 久久国产精品波多野结衣| 久久精品影视| 91超碰caoporn97人人| 亚洲国产无线乱码在线观看| 久久久久成人黄色影片| 免费激情视频在线观看| 国产精品成人3p一区二区三区| 色诱女教师一区二区三区| 成人午夜精品视频| 中文字幕在线不卡视频| 欧美视频在线观看网站| 极品国产人妖chinesets亚洲人妖| 国产一区二区三区视频在线观看| 国产成人精品777777| 国产成人aaa| 日韩精品一区二区免费| 波多野结衣在线一区二区| 97精品视频在线| 九九热视频在线观看| 一个色综合网站| 91欧美视频在线| 欧美三级电影在线| 一本色道久久综合| 欧美最猛性xxxxx亚洲精品| 亚洲熟妇av乱码在线观看| 99精品国产视频| 免费cad大片在线观看| 国产成人精品一区二区三区视频| 日韩在线中文视频| 性生交大片免费看女人按摩| 香港成人在线视频| 国产又粗又黄又猛| 国产精品99久久久| 欧美精品99久久| 国产91精品入| 精品国产一区二区三区在线观看 | 亚洲精品白虎| 亚洲精品一区二区三区在线| 中日韩美女免费视频网址在线观看 | 久热精品在线观看| 久久婷婷综合激情| 黄色三级中文字幕| 亚洲三级网页| 2019亚洲男人天堂| 日本免费中文字幕在线| 欧洲一区二区av| 五月婷婷综合在线观看| 另类的小说在线视频另类成人小视频在线| 国产亚洲精品久久久久久久| 啪啪亚洲精品| 官网99热精品| 好久没做在线观看| 色偷偷888欧美精品久久久| 亚洲精品911| 欧美三级电影网站| 69视频免费在线观看| 久久久亚洲欧洲日产国码αv| 日本77777| 三级亚洲高清视频| 久久成人18免费网站| 久久久久国产免费| 欧美在线免费| 偷拍视频一区二区| 欧美aaa级| 欧美中文字幕在线视频| 性欧美videoshd高清| 中文字幕一精品亚洲无线一区 | 国产999精品久久久久久绿帽| 毛片av免费在线观看| 亚洲第一区色| 久久精品国产第一区二区三区最新章节| 好吊日av在线| 久久的精品视频| 国产高清视频免费| 亚洲国产精品自拍| 国产av无码专区亚洲av毛网站| 欧美激情综合在线| 亚洲国产精品三区| 亚洲欧美日韩国产一区二区| 又大又硬又爽免费视频| 欧美在线视屏| 警花观音坐莲激情销魂小说| 98精品视频| 国产精品成人在线观看| 人妻少妇精品视频一区二区三区| 成人午夜视频在线观看| 国产成人av免费观看| 亚洲福利免费| 免费网站在线观看视频| 欧美激情自拍| 青青在线视频免费观看| 欧美a级在线| av影院在线播放| 欧美1区2区3区| 4444亚洲人成无码网在线观看| 综合日韩在线| 国产精品久久久影院| 欧美亚洲tv| 久久一区二区精品| 99久久久国产| 亚洲最大福利视频网| 视频一区在线| 国产精品扒开腿做爽爽爽视频| 免费成人黄色| 插插插亚洲综合网| 搞黄网站在线看| 欧美在线免费看| 素人一区二区三区| 91欧美日韩一区| 国产综合av在线| 久久午夜影院| 欧美一区二区视频17c| 成人黄色av| 玖玖精品在线视频| 欧美日一区二区三区在线观看国产免| 国产乱人伦精品一区二区三区| 影音先锋久久| 99草草国产熟女视频在线| 日本不卡视频一二三区| 天天综合天天添夜夜添狠狠添| 国产精品自拍毛片| 疯狂揉花蒂控制高潮h| 国产精品视频线看| 妖精视频在线观看| 不卡视频一二三| 波多野结衣在线免费观看| 国产精品1区二区.| 亚洲国产无码精品| 综合网在线视频| 五月婷婷婷婷婷| 久久免费偷拍视频| 亚洲综合图片一区| 午夜在线电影亚洲一区| 又骚又黄的视频| 亚洲成人久久网| 成人一区二区不卡免费| 国产精品v一区二区三区| 永久久久久久| 精品av一区二区| 四虎4hu永久免费入口| 在线视频精品| 亚洲18在线看污www麻豆| 成人91在线观看| 中文天堂资源在线| 亚洲一区影音先锋| 亚洲天堂视频在线| 日韩麻豆第一页| 青青操视频在线| 亚洲精选在线观看| 国产福利视频在线| 欧美成人黄色小视频| 国产精品迅雷| 国产精品久久久久久久久久久久午夜片 | 特级特黄刘亦菲aaa级| 中文字幕欧美激情| 日韩资源在线观看| 久操av在线| 国产视频福利一区| 外国电影一区二区| www 成人av com| 天天射成人网| av动漫在线播放| 久久99在线观看| 国产毛片欧美毛片久久久| 亚洲国产va精品久久久不卡综合| 又骚又黄的视频| 国产一区二区精品丝袜| 182在线视频观看| 97视频中文字幕| 91tv官网精品成人亚洲| 亚洲成人福利在线观看| 蜜臀久久99精品久久久画质超高清 | 欧美精品一区二区三区高清aⅴ| 日本在线免费| 国产精品久久久一区| 亚洲尤物av| 国产主播在线看| 成人蜜臀av电影| 久久久久久久黄色| 日韩视频在线永久播放| 欧美特级特黄aaaaaa在线看| 香蕉精品999视频一区二区| 欧洲精品毛片网站| gogo大尺度成人免费视频| 日本一区二区视频| 久久精品二区三区| 精品久久久久久中文字幕人妻最新| 亚洲aaa精品| 天堂成人在线视频| 国内精品久久久久久中文字幕| 色一区二区三区| 成人免费高清完整版在线观看| 2020国产精品极品色在线观看| 三上悠亚免费在线观看| 国产毛片精品一区| 久久久久久久久毛片| 日韩三级av在线播放| 影院在线观看全集免费观看| 欧美中文字幕在线| 九九综合九九| 别急慢慢来1978如如2| 亚洲国产激情av| 91麻豆国产在线| 亚洲精品国产美女| 日韩深夜视频| 日产精品久久久一区二区| 日韩**一区毛片| 日韩激情小视频| 欧美综合视频在线观看| www.在线播放| 亚洲aaaaaa| 日韩精品首页| 亚洲图片制服诱惑| 人人妻人人澡人人爽精品日本| 午夜精品久久久久久久久久久久 | 中文另类视频| 中文字幕在线乱| av中文字幕在线不卡| 欧美日韩 一区二区三区| 日韩视频123| 91禁在线看| 视频一区在线免费观看| 国产精一区二区三区| wwwxxx亚洲| 日韩中文字幕视频在线| 1313精品午夜理伦电影| 日韩av在线综合| 亚洲免费观看高清完整版在线观看 | 国产成人精品一区二区三区在线 | 亚洲免费观看高清完整版在线 | 亚洲精品久久久久久久蜜桃臀| 91天堂素人约啪| 麻豆亚洲av成人无码久久精品| 亚洲国产高清自拍| 日本黄色一区| 国产3p露脸普通话对白| 国产在线不卡一区| 国产精品 欧美 日韩| 日韩女优毛片在线| 波多野结衣久久精品| 国产一二三四五| 国产亚洲成av人在线观看导航| www欧美在线| 俺去亚洲欧洲欧美日韩|