Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带连接的防护块_Java_Multithreading_Join_Guard - Fatal编程技术网

Java 带连接的防护块

Java 带连接的防护块,java,multithreading,join,guard,Java,Multithreading,Join,Guard,我需要通过几个线程进行同步。我不创建线程,但我知道有多少线程。所以我写了这个内部防护块: private class Guard { int waiters = 0; boolean wait; synchronized void addWaiter() { ++waiters; wait = true; while (wait && waiters != threadNum()) {

我需要通过几个线程进行同步。我不创建线程,但我知道有多少线程。所以我写了这个内部防护块:

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()
循环中释放之前,它可能会被第二次调用,这显然会破坏整个保护逻辑。因此,我需要在线程从保护中释放之前以某种方式连接线程。有这样的设计吗?实现它最优雅的方式是什么。请记住,线程不是由我创建的


谢谢。

听起来像是一份工作。您可以将闩锁设置为等待N次倒计时。有关示例,请参阅Javadoc。

听起来像是一份工作。您可以将闩锁设置为等待N次倒计时。有关示例,请参见Javadoc。

Aha!!应该如此。我重新发明了轮子。不幸的是,它是方形的。轮胎公司一直在重新发明车轮,但那是他们的工作。我倾向于把并发问题留给专家来解决作为旁注,在这种情况下,CyclicBarrier似乎是一个更好的候选人。它是CountDownLatch的可重用的表亲。为了继续delmet的类比,Java 7将与Phaser一起推出,它是CountDownLatch和cyclicbarrier的后代:)啊哈!!应该如此。我重新发明了轮子。不幸的是,它是方形的。轮胎公司一直在重新发明车轮,但那是他们的工作。我倾向于把并发问题留给专家来解决作为旁注,在这种情况下,CyclicBarrier似乎是一个更好的候选人。它是CountDownLatch的可重用的表亲。为了继续delmet的类比,Java 7将推出Phaser,它是CountDownLatch和cyclicbarrier的后代:)