返回CompletableFuture:Java 8功能亮点
CompletableFuture與未來:與Java 8新功能保持異步
Java 8于2014年3月發布,并附帶了許多新功能。 鮮為人知的,極為有用卻被人誤解的功能之一是對Future接口的全新改進,即擴展:CompletableFuture <T>。
在下面的文章中,我們將提供CompletableFuture的整體視圖,以及它與簡單的Future有何不同以及何時有用。
異步Java代碼
Java 7向我們介紹了Future,它表示異步計算的結果。 使用Future對象的主要優點是,您可以在等待外部資源的同時做其他事情。 一種等待資源的非阻塞方式。
使用Future意味著您可以編寫一個方法,而不是立即返回結果,而是將返回Future對象。 當您需要實際結果時,只需使用Future.get()即可在計算完成后返回該值。
您還可以得到方法檢查計算是否是做的,一個辦法取消/檢查它是否被取消。
例如,假設您要調用某個外部資源,例如…… Marvel的開發人員API ,拔出所有名稱中帶有字母“ C”的超級英雄:
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是的,如果我們確實想使用完全異步的非阻塞選項,那我們就不走運了。 我們無法保證未來確實存在,我們可能必須等待。 這是CompletableFuture出現的地方,它有助于解決棘手的問題。
那么,CompletableFuture有什么新功能?
CompletableFuture <T>擴展了Future <T>并使之……可完成。 考慮到Future對象在Java 8之前是受限制的,只有5種可用方法,所以這很重要。
此新的和改進的CompletableFuture具有2個主要優點:
回到我們的簡單示例,假設Marvel的API沒有返回及時的結果,并且getMarvelHeroWithCharacter()仍在處理中,這是很耗時的,而與此同時我們已經完成了其他所有想做的事情。 假設我們不想等待( 我們的生命結束了 ),CompletableFuture可以幫助我們返回中間結果。 像……神秘,因為在最壞的情況下,她可以變身為其他超級英雄。
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您也可以預先創建一個完整的CompletableFuture,該函數將返回一個已知值。 如果您想將已知值與需要計算的值結合起來,這在測試環境中可能會派上用場:
CompletableFuture < String > cf =CompletableFuture.completedFuture("I'm done!"); cf.isDone(); // return true cf.join(); // return "I'm done"還有數十種其他更有用的方法,它們包括轉換并作用于一個CompletableFuture(thenApply),在完成時運行代碼(thenAccept / thenRun),將兩個CompletableFuture組合在一起等等。 要獲得完整的指南,我們建議您閱讀Java 8:CompletableFuture的權威指南 。
滿足選擇
如果您使用的是Guava或Scala(及其Futures ),則此新功能可能聽起來很熟悉。 它與Guava的ListenableFuture相似,后者為Future對象定義了一個一致的API,用于注冊完成回調。
與新的CompletableFuture相似,添加回調的功能允許以異步有效的方式響應傳入的事件。 您可以注冊要在計算完成后執行的回調,并支持基本Future接口不支持的許多操作。
當艱難的時刻
使用CompletableFuture使我們能夠與我們的代碼一起運行,而不必等待結果,但是它仍然不能保證您的代碼在生產中運行時不會中斷。 發生錯誤時,您將需要盡快識別和分析它們,以部署修補程序。
對于此類情況, Takipi將使您能夠在問題出現時有效地解決代碼中的問題,而不必“等”到其他人遇到它們。
最后的想法
CompletableFuture恰好適合作為異步編程趨勢的一部分,該趨勢在過去幾年中變得很流行。 難怪每個人都在談論它,因為我們可以使用它同時運行許多任務,從而實現最佳工作流程。
如果您已經是異步編程的狂熱愛好者,則可能需要查看我們有關7種您必須知道的反應性編程工具的文章 。
翻譯自: https://www.javacodegeeks.com/2016/06/back-completablefuture-java-8-feature-highlight.html
總結
以上是生活随笔為你收集整理的返回CompletableFuture:Java 8功能亮点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏《匹诺曹的谎言》6 分钟实机演示公布
- 下一篇: 在Elasticsearch中索引Jav