0

我需要在多个线程上同步。我不创建线程,但我知道有多少。所以我写了这个内部保护块:

private class Guard {
    int waiters = 0;
    boolean wait;
    synchronized void addWaiter() {
        ++waiters;
        wait = true;
        while (wait && waiters != threadNum()) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }
        waiters = 0;
        wait = false;
        notifyAll();
    }
}

这个受保护的块在循环中执行。所以问题是它可能会在第一次调用的所有线程都从wait()循环中释放之前被第二次调用,这显然搞砸了守卫的整个逻辑。所以我需要让线程在从警卫中释放之前以某种方式加入。有这个设计吗?什么是完成它的最优雅的方式。请记住,线程不是由我创建的。

谢谢。

4

1 回答 1

4

听起来像是CountDownLatch的工作。您可以将锁存器设置为等待 N 倒计时。有关示例,请参阅 Javadoc。

于 2011-01-02T19:43:53.717 回答