Java 9即將在2017年7月正式發布,并提供一份關于新增和修訂的功能以及一些特性的說明清單。對JDK增強提議(簡稱JEP)進行搜索時,我們發現了JEP 266中包含了:對CompletableFuture進行了不少更新,和更新了并發功能和要支持Reactive Streams機制相關的內容,這引起了我的注意。
在本文中,我們就聊聊JEP 266的新增和修訂的功能吧,并且它很有可能成為Java 9 的特性之一。
1.Java 9將迎來哪些強化?
作為甲骨文公司起草的JDK增強提議(簡稱JEP)之一,它包含了很多有趣的更新,目的是用于解決并行機制相關的問題。
根據這份提議,Java 9將迎來以下變更與更新:
各接口支持Reactive Streams發布的訂閱框架。
CompletableFuture API將得到全面改進,包括支持支持延遲、超時、子類化和其它方法。
更多小型調整與javadoc規范修改。
這里我們主要分析兩項核心內容。第一項內容是Java 9將支持Reactive Streams,這個提議來自Java技術社區提出的改進計劃,目的是改進開發者的并行工作流程。其次是CompletableFuture API的修復性提升,可以讓開發者回到Future
但這些都有怎樣的實際意義呢?
2.Flow類介紹
第一項更新的“各接口支持Reactive Streams發布的訂閱框架”,就是將新的Flow類嵌套進去,和可供開發者用于創建自定義組件的SubmissionPublisher。
讓我們逐一進行討論。Reactive Streams能夠解決背壓(back-pressure)難題。當輸入任務速率高于系統的處理能力時,就會發生數據累積并會對未處理數據提供一個緩沖區。
就此,我們與Reactive Streams開發團隊Akka高級開發者Konrad Malawski進行了交流,他解釋了Reactive Streams 的重要性以及如何使用。
甲骨文方面指出,這項新增強將包含“一套小型接口,用以對接Reactive Streams項目中各類得到廣泛使用的定義接口。”
而Flow類的作用也正在于此。Reactive Steams由4個Java接口構建而成:
處理器(Processor)
發布商(Publisher)
訂閱用戶(Subscriber)
訂閱(Subscription)
Flow類允許各互關聯接口與靜態方法建立受控流程組件,發布者產生由一個或多個訂閱者消費的項目,每個訂閱者由訂閱管理。
Reactive Streams位于容器對象java.util.concurrent.Flow之下。大開發者可以在這里找到 Flow.Publisher,一個用作 lambda 表達式或方法引用的賦值目標功能接口。此接口將顯著簡化面向Flow.Subscription的元素生成方式,并由Flow.Subscription將二者關聯起來。
另一項元素為Flow.Subscriber,是用異步工作機制運作,并能通過請求實現觸發。它能能夠從Flow.Subscription處獲取多個元素,大家可根據需求自定義緩沖區大小。
這些接口同時適用于并發與分布式異步設置,且接口之間的通信,是通過一種簡單的流控制形式實現,并可用于避免發生資源管理的問題。
感興趣的朋友可以查看關于java.util.concurrent.Flow的代碼示例。轉到此處:http://gee.cs.oswego.edu/dl/concurrency-interest/index.html/
另外,大家也無需等待Java 9正式發布即可體驗Reactive Streams接口,目前也已經在多種第三方庫采用此類接口。
3.CompletableFuture新特性
Java 8首次引入CompletableFuture是,就已經對Future
CompletableFuture對Future對象做出兩方面擴展。其能夠在無需任何異步等待的情況下,通過調用complete()方法即可顯式完成。另外,它還允許利用一系列操作中,構建起數據處理管道。
如此一來,任意類型的值皆能在 Future 中使用默認返回值,即使當前計算尚未完成,它也可使用默認即時結果。這些更新將能夠有效解決開發者在使用Java 8時面臨的部分難題。
總結
Java 9確實為我們帶來一系列重大更新與改進,其中 JEP 266 會是最有趣的一部分改進。另外,我們認為JEP 266,也是甲骨文發布的最值得關注的更新之一,因為其源自技術社區本身的倡議,旨在幫助開發者解決異步流程處理中的一些常見難題。我們對此深表贊賞,同時也期待著Java 9的正式發布。
原文標題:The Essential Java 9 Feature You Probably Never Heard Of
作者:Henn Idan