返回CompletableFuture:Java 8功能亮点
CompletableFuture與未來(lái):與Java 8新功能保持異步
Java 8于2014年3月發(fā)布,并附帶了許多新功能。 鮮為人知的,極為有用卻被人誤解的功能之一是對(duì)Future接口的全新改進(jìn),即擴(kuò)展:CompletableFuture <T>。
在下面的文章中,我們將提供CompletableFuture的整體視圖,以及它與簡(jiǎn)單的Future有何不同以及何時(shí)有用。
異步Java代碼
Java 7向我們介紹了Future,它表示異步計(jì)算的結(jié)果。 使用Future對(duì)象的主要優(yōu)點(diǎn)是,您可以在等待外部資源的同時(shí)做其他事情。 一種等待資源的非阻塞方式。
使用Future意味著您可以編寫(xiě)一個(gè)方法,而不是立即返回結(jié)果,而是將返回Future對(duì)象。 當(dāng)您需要實(shí)際結(jié)果時(shí),只需使用Future.get()即可在計(jì)算完成后返回該值。
您還可以得到方法檢查計(jì)算是否是做的,一個(gè)辦法取消/檢查它是否被取消。
例如,假設(shè)您要調(diào)用某個(gè)外部資源,例如…… Marvel的開(kāi)發(fā)人員API ,拔出所有名稱中帶有字母“ C”的超級(jí)英雄:
Future < String > marvel = executor.submit(new Callable < String > () {public String call() {return getMarvelHeroWithCharacter(“C”); // totally not making this up} });// other very important stuff of course, non-blocking ftwSystem.out.println(marvel.get()); // this bit is blocking if the result isn’t ready yet是的,如果我們確實(shí)想使用完全異步的非阻塞選項(xiàng),那我們就不走運(yùn)了。 我們無(wú)法保證未來(lái)確實(shí)存在,我們可能必須等待。 這是CompletableFuture出現(xiàn)的地方,它有助于解決棘手的問(wèn)題。
那么,CompletableFuture有什么新功能?
CompletableFuture <T>擴(kuò)展了Future <T>并使之……可完成。 考慮到Future對(duì)象在Java 8之前是受限制的,只有5種可用方法,所以這很重要。
此新的和改進(jìn)的CompletableFuture具有2個(gè)主要優(yōu)點(diǎn):
回到我們的簡(jiǎn)單示例,假設(shè)Marvel的API沒(méi)有返回及時(shí)的結(jié)果,并且getMarvelHeroWithCharacter()仍在處理中,這是很耗時(shí)的,而與此同時(shí)我們已經(jīng)完成了其他所有想做的事情。 假設(shè)我們不想等待( 我們的生命結(jié)束了 ),CompletableFuture可以幫助我們返回中間結(jié)果。 像……神秘,因?yàn)樵谧顗牡那闆r下,她可以變身為其他超級(jí)英雄。
CompletableFuture < String > marvel = executor.submit(new Callable < String > () {public String call() {return getMarvelHeroWithCharacter(“C”);} });// other stuff goes heremarvel.complete(“Mystique”); // sets a “default” value if not yet completedSystem.out.println(marvel.get()); // non-blocking您也可以預(yù)先創(chuàng)建一個(gè)完整的CompletableFuture,該函數(shù)將返回一個(gè)已知值。 如果您想將已知值與需要計(jì)算的值結(jié)合起來(lái),這在測(cè)試環(huán)境中可能會(huì)派上用場(chǎng):
CompletableFuture < String > cf =CompletableFuture.completedFuture("I'm done!"); cf.isDone(); // return true cf.join(); // return "I'm done"還有數(shù)十種其他更有用的方法,它們包括轉(zhuǎn)換并作用于一個(gè)CompletableFuture(thenApply),在完成時(shí)運(yùn)行代碼(thenAccept / thenRun),將兩個(gè)CompletableFuture組合在一起等等。 要獲得完整的指南,我們建議您閱讀Java 8:CompletableFuture的權(quán)威指南 。
滿足選擇
如果您使用的是Guava或Scala(及其Futures ),則此新功能可能聽(tīng)起來(lái)很熟悉。 它與Guava的ListenableFuture相似,后者為Future對(duì)象定義了一個(gè)一致的API,用于注冊(cè)完成回調(diào)。
與新的CompletableFuture相似,添加回調(diào)的功能允許以異步有效的方式響應(yīng)傳入的事件。 您可以注冊(cè)要在計(jì)算完成后執(zhí)行的回調(diào),并支持基本Future接口不支持的許多操作。
當(dāng)艱難的時(shí)刻
使用CompletableFuture使我們能夠與我們的代碼一起運(yùn)行,而不必等待結(jié)果,但是它仍然不能保證您的代碼在生產(chǎn)中運(yùn)行時(shí)不會(huì)中斷。 發(fā)生錯(cuò)誤時(shí),您將需要盡快識(shí)別和分析它們,以部署修補(bǔ)程序。
對(duì)于此類(lèi)情況, Takipi將使您能夠在問(wèn)題出現(xiàn)時(shí)有效地解決代碼中的問(wèn)題,而不必“等”到其他人遇到它們。
最后的想法
CompletableFuture恰好適合作為異步編程趨勢(shì)的一部分,該趨勢(shì)在過(guò)去幾年中變得很流行。 難怪每個(gè)人都在談?wù)撍?#xff0c;因?yàn)槲覀兛梢允褂盟瑫r(shí)運(yùn)行許多任務(wù),從而實(shí)現(xiàn)最佳工作流程。
如果您已經(jīng)是異步編程的狂熱愛(ài)好者,則可能需要查看我們有關(guān)7種您必須知道的反應(yīng)性編程工具的文章 。
翻譯自: https://www.javacodegeeks.com/2016/06/back-completablefuture-java-8-feature-highlight.html
總結(jié)
以上是生活随笔為你收集整理的返回CompletableFuture:Java 8功能亮点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 游戏《匹诺曹的谎言》6 分钟实机演示公布
- 下一篇: 在Elasticsearch中索引Jav