亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是 Golang 的 WaitGroup 的 Java 等價物

什么是 Golang 的 WaitGroup 的 Java 等價物

Go
慕的地6264312 2021-09-27 21:11:13
Golang 有一種叫做 a 的東西WaitGroup,有點像 Java 中的 aCompletionService或 aCountDownLatch或 aSemaphore或后者的某種組合。我不完全確定您將如何在 Java 中實現 WaitGroup。我會想象帶有某種 Poison 消息的自定義 CompletionService 將是要走的路線(因為隊列無法說出它們何時完成)但也許有更好的并發數據結構/鎖?編輯我在下面發布了一個可能的解決方案Semaphore,我認為它比使用thread.join.
查看完整描述

3 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

WaitGrouphasAdd(delta)方法可以在 aWaitGroup創建后調用。CountDownLatch不支持,需要提前指定任務數。Phaser在這種情況下可以使用JDK7 :


phaser.register = wg.Add(1)

phaser.arrive = wg.Done

phaser.await = wg.Wait


查看完整回答
反對 回復 2021-09-27
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

public class WaitGroup {


    private int jobs = 0;


    public synchronized void add(int i) {

        jobs += i;

    }


    public synchronized void done() {

        if (--jobs == 0) {

            notifyAll();

        }

    }


    public synchronized void await() throws InterruptedException {

        while (jobs > 0) {

            wait();

        }

    }


}


查看完整回答
反對 回復 2021-09-27
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

在查看了 golang 文檔并確認 Semaphore 不會因大量許可而中斷后,我認為Semaphoreset toInteger.MAX_VALUE是最接近 golang 的WaitGroup。

thread.join可能更類似于您將 WaitGroup 與 goroutines 一起使用的方式,因為它處理線程的清理,但是WaitGroup像 a 一樣的隔離Semaphore不知道增加它的內容。

CountdownLatch 不起作用,因為您需要先驗地知道要運行多少個線程,并且不能增加 CountdownLatch。

假設信號量設置為Integer.MAX_VALUE

wg.Add(n) == semaphore.acquire(n)

wg.Done() == semaphore.release()

并在您希望一切停止的線程中:

wg.Wait() == semaphore.acquire(Integer.MAX_VALUE)

但是我不確定所有的語義結轉,所以我現在不打算將其標記為正確。


查看完整回答
反對 回復 2021-09-27
  • 3 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號