1 回答

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
它不進(jìn)行二分搜索——它正在構(gòu)建一個(gè)平衡的二叉樹,在葉子上輸入 futures,當(dāng)它的兩個(gè)孩子都完成時(shí),每個(gè)內(nèi)部節(jié)點(diǎn)都完成。
出于代碼中不明顯的某種原因,代碼的作者一定已經(jīng)決定將allOf(_,_)
恰好兩個(gè)期貨作為他的原始操作來考慮是最有效的,如果他要求在allOf(...)
兩個(gè)以上的期貨之間,他正在制造它作為這些二進(jìn)制原語的級聯(lián)。
這棵樹應(yīng)該是平衡的,無論最后一個(gè)要完成的未來是什么,在頂部的未來可以完成之前,只有少數(shù)層次要崩潰。這在某些情況下提高了性能,因?yàn)樗_保在我們完全完成之前可以處理盡可能多的工作,此時(shí)(如果我們幸運(yùn)的話)CPU 可能只是閑置,等待異步操作完全的。
樹的平衡是通過讓最頂層的內(nèi)部節(jié)點(diǎn)在其左子節(jié)點(diǎn)下的葉子數(shù)量與在其右子節(jié)點(diǎn)下的葉子數(shù)量一樣多來完成的——因此兩個(gè)子節(jié)點(diǎn)都獲得原始數(shù)組的大約一半,然后代碼遞歸地從每一半構(gòu)建一棵樹陣列。分成兩半看起來有點(diǎn)像二進(jìn)制搜索的索引計(jì)算。
基本結(jié)構(gòu)被似乎設(shè)計(jì)為
當(dāng)一些原始期貨已經(jīng)完成時(shí),使用分配更少的優(yōu)化代碼路徑,并且
確保
allOf(_)
只有一個(gè)元素的結(jié)果將返回一個(gè)新的?CompleteableFuture
.?對于大多數(shù)目的,只返回單個(gè)元素就可以了,但作者一定想確保庫的用戶可以依賴新鮮的對象,如果他們將它們用作散列映射中的鍵,或其他依賴的邏輯能夠從輸入中分辨出輸出,以及throw new NullPointerException();
通過使用?:
和內(nèi)聯(lián)賦值而不是誠實(shí)的if
陳述只有一個(gè)。這可能會(huì)以犧牲可讀性為代價(jià)產(chǎn)生略小的字節(jié)碼。
添加回答
舉報(bào)