Java中的异步等待
編寫(xiě)異步代碼很困難。 試圖了解異步代碼應(yīng)該做什么的難度更大。 承諾是嘗試描述延遲執(zhí)行流程的一種常見(jiàn)方式:首先做一件事,然后再做另一件事,以防萬(wàn)一出錯(cuò)再做其他事情。
在許多語(yǔ)言中,承諾已成為協(xié)調(diào)異步行為的事實(shí)上的方法。 Java 8終于有了該程序,并引入了CompletableFuture; 盡管很認(rèn)真,但誰(shuí)設(shè)計(jì)了API? 一團(tuán)糟 !
許諾的麻煩在于,控制流程可能變得非常簡(jiǎn)單。 隨著控制流程變得越來(lái)越復(fù)雜,幾乎變得難以理解(執(zhí)行此操作,然后,除非是星期三,否則,請(qǐng)執(zhí)行此操作,如果有錯(cuò)誤,請(qǐng)返回三個(gè)空格,yada yada yada)。
很酷的孩子們已經(jīng)開(kāi)始使用異步…等待。 C#擁有它。 JavaScript有它。 現(xiàn)在……現(xiàn)在,通過(guò)EA的一些大才能,Java擁有了它! 是的,Java具有可用的async ... await構(gòu)造,而無(wú)需更改語(yǔ)言!
一個(gè)簡(jiǎn)單的例子:我們可以使用CompletableFuture編寫(xiě)幾個(gè)異步操作,如下所示:
private static void theOldWay() {doAThing().thenCompose(Main::doAnotherThing).thenAccept(Main::reportSuccess).exceptionally(Main::reportFailure); }這應(yīng)該很簡(jiǎn)單,通常使用期貨代碼與這個(gè)簡(jiǎn)單代碼相去甚遠(yuǎn)。 但是,借助EA異步等待的魔力,我們可以像這樣重新編寫(xiě)它:
private static CompletableFuture<Void> theNewWay() {try {String intermediate = await(doAThing());String result = await(doAnotherThing(intermediate));reportSuccess(result);} catch (Throwable t) {reportFailure(t);}return completedFuture(null); }它看起來(lái)像同步代碼。 但是對(duì)Async.await的調(diào)用是神奇的。 這些調(diào)用被重新編寫(xiě)(在運(yùn)行時(shí)或構(gòu)建時(shí),如您所愿),以使調(diào)用無(wú)阻塞!
該代碼更易于編寫(xiě),易于閱讀,易于調(diào)試一百萬(wàn)倍,最重要的是它可以自然擴(kuò)展。 隨著代碼變得越來(lái)越復(fù)雜,您可以使用常規(guī)的重構(gòu)工具來(lái)控制它。 使用CompletableFutures,您最終會(huì)繞過(guò)所有這些將來(lái)的對(duì)象,并且在某個(gè)地方,有一天您會(huì)錯(cuò)過(guò)代碼路徑和繁榮! 生產(chǎn)中的一個(gè)免費(fèi)錯(cuò)誤。
因此,即使您堅(jiān)持使用Java,您仍然可以像酷孩子一樣使用async…await!
翻譯自: https://www.javacodegeeks.com/2018/02/async-await-java.html
總結(jié)
以上是生活随笔為你收集整理的Java中的异步等待的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑系统默认的图标(电脑桌面默认图标)
- 下一篇: 过滤序列,惰性序列_Java 8的惰性序