第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么 CompletableFuture allOf 方法會(huì)進(jìn)行二分查找?

為什么 CompletableFuture allOf 方法會(huì)進(jìn)行二分查找?

慕容708150 2023-05-17 15:03:14
我想知道allOf方法是否CompletableFuture進(jìn)行輪詢或進(jìn)入等待狀態(tài),直到所有CompletableFutures傳遞給該方法的方法都完成執(zhí)行。allOf我查看了方法的代碼IntelliJ,它正在進(jìn)行某種二進(jìn)制搜索。請幫助我找出方法allOf的CompletableFuture實(shí)際作用。public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) {    return andTree(cfs, 0, cfs.length - 1);}/** Recursively constructs a tree of completions. */static CompletableFuture<Void> andTree(CompletableFuture<?>[] cfs, int lo, int hi) {    CompletableFuture<Void> d = new CompletableFuture<Void>();    if (lo > hi) // empty        d.result = NIL;    else {        CompletableFuture<?> a, b;        int mid = (lo + hi) >>> 1;        if ((a = (lo == mid ? cfs[lo] :                  andTree(cfs, lo, mid))) == null ||            (b = (lo == hi ? a : (hi == mid+1) ? cfs[hi] :                  andTree(cfs, mid+1, hi)))  == null)            throw new NullPointerException();        if (!d.biRelay(a, b)) {            BiRelay<?,?> c = new BiRelay<>(d, a, b);            a.bipush(b, c);            c.tryFire(SYNC);        }    }    return d;}/** Pushes completion to this and b unless both done. */final void bipush(CompletableFuture<?> b, BiCompletion<?,?,?> c) {    if (c != null) {        Object r;        while ((r = result) == null && !tryPushStack(c))            lazySetNext(c, null); // clear on failure        if (b != null && b != this && b.result == null) {            Completion q = (r != null) ? c : new CoCompletion(c);            while (b.result == null && !b.tryPushStack(q))                lazySetNext(q, null); // clear on failure        }    }}final CompletableFuture<V> tryFire(int mode) {    CompletableFuture<V> d;    CompletableFuture<T> a;    CompletableFuture<U> b;    if ((d = dep) == null ||        !d.orApply(a = src, b = snd, fn, mode > 0 ? null : this))        return null;    dep = null; src = null; snd = null; fn = null;    return d.postFire(a, b, mode);}
查看完整描述

1 回答

?
慕斯709654

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é)碼。


查看完整回答
反對 回復(fù) 2023-05-17
  • 1 回答
  • 0 關(guān)注
  • 193 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)