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 不会因大量许可而中断后,我认为Semaphore
set 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 关注
- 158 浏览
添加回答
举报