为了账号安全,请及时绑定邮箱和手机立即绑定

什么是 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 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信