Java与Golang的WaitGroup等效

Ada*_*ent 6 java go

Golang有一种叫做a的东西WaitGroup,类似于Java中的a CompletionService或a CountDownLatch或a Semaphore或后者的某种组合。

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

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

kos*_*tya 6

WaitGroup有可以在创建Add(delta)a 之后调用的方法。不支持此功能,需要提前指定任务数量。在这种情况下可以使用JDK7代替:WaitGroupCountDownLatchPhaser

phaser.register = wg.Add(1)
phaser.arrive = wg.Done
phaser.await = wg.Wait
Run Code Online (Sandbox Code Playgroud)


use*_*928 5

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

}
Run Code Online (Sandbox Code Playgroud)