Golang有一种叫做a的东西WaitGroup
,类似于Java中的a CompletionService
或a CountDownLatch
或a Semaphore
或后者的某种组合。
我不完全确定如何在Java中实现WaitGroup。我可以想象一个带有某种Poison消息的自定义CompletionService将成为要走的路(因为队列不能说何时完成),但是也许有更好的并发数据结构/锁?
编辑我在下面发布了一个可能的解决方案Semaphore
,我认为它比使用更加类似thread.join
。
WaitGroup
有可以在创建Add(delta)
a 之后调用的方法。不支持此功能,需要提前指定任务数量。在这种情况下可以使用JDK7代替:WaitGroup
CountDownLatch
Phaser
phaser.register = wg.Add(1)
phaser.arrive = wg.Done
phaser.await = wg.Wait
Run Code Online (Sandbox Code Playgroud)
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)
归档时间: |
|
查看次数: |
2088 次 |
最近记录: |