猿问

什么是 Golang 的 WaitGroup 的 Java 等价物

Golang 有一种叫做 a 的东西WaitGroup,有点像 Java 中的 aCompletionService或 aCountDownLatch或 aSemaphore或后者的某种组合。

我不完全确定您将如何在 Java 中实现 WaitGroup。我会想象带有某种 Poison 消息的自定义 CompletionService 将是要走的路线(因为队列无法说出它们何时完成)但也许有更好的并发数据结构/锁?

编辑我在下面发布了一个可能的解决方案Semaphore,我认为它比使用thread.join.


慕的地6264312
浏览 159回答 3
3回答

慕哥6287543

WaitGrouphasAdd(delta)方法可以在 aWaitGroup创建后调用。CountDownLatch不支持,需要提前指定任务数。Phaser在这种情况下可以使用JDK7 :phaser.register = wg.Add(1)phaser.arrive = wg.Donephaser.await = wg.Wait

HUWWW

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();        }    }}

月关宝盒

在查看了 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)但是我不确定所有的语义结转,所以我现在不打算将其标记为正确。
随时随地看视频慕课网APP

相关分类

Go
我要回答