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