3 回答
TA貢獻1831條經驗 獲得超10個贊
WaitGrouphasAdd(delta)方法可以在 aWaitGroup創建后調用。CountDownLatch不支持,需要提前指定任務數。Phaser在這種情況下可以使用JDK7 :
phaser.register = wg.Add(1)
phaser.arrive = wg.Done
phaser.await = wg.Wait
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();
}
}
}
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)
但是我不確定所有的語義結轉,所以我現在不打算將其標記為正確。
- 3 回答
- 0 關注
- 187 瀏覽
添加回答
舉報
