Java中的Rendez-Vous不起作用

Java中的Rendez-Vous不起作用,java,multithreading,concurrency,wait,notify,Java,Multithreading,Concurrency,Wait,Notify,我在使用wait()和notify()时遇到一些问题。我需要一种你的感觉 下面是一段代码: class A { private Rdv r; public A(Rdv r) { this.r = r; } public void someMethod() { synchronized(r) { r.wait(); } // ***** some stuff never r

我在使用
wait()
notify()
时遇到一些问题。我需要一种你的感觉

下面是一段代码:

class A {
    private Rdv r;

    public A(Rdv r) {
        this.r = r;
    }

    public void someMethod() {
        synchronized(r) {
            r.wait();
        }

        // ***** some stuff never reached*****
    }
}

class Rdv { 
    private int added;
    private int limit;

    public Rdv(int limit) {
        this.added = 0;
        this.limit = limit;
    }

    public void add() {
        this.added++;

        if(this.added == this.limit) {
            synchronized(this) {
                this.notifyAll();
            }
        }
    }
}

class Main {
    public static void main(String[] args) {
        Rdv rdv = new Rdv(4);

        new Runnable() {
            public void run() {
                A a = new A(rdv);
                a.someMethod();
            }
        }.run();

        rdv.add();
        rdv.add();
        rdv.add();
        rdv.add();
    }
}
这个想法是等到4个线程告诉“嘿,我完成了”之后再运行
someMethod()
的末尾。 但是,
wait()
将永远持续,尽管有
notifyAll()

我不明白

wait()
notify()
不是直接使用的,而是更好的库用于低级同步的原语

您应该使用更高级别的并发机制,例如。您可能希望使用值为4的
倒计时闩锁。让每个线程调用闩锁的
countDown()
方法,以及要等待调用的
wait()
方法


当然不会达到,因为类A的每个实例都有一个不同的类Rdv实例


在A类< /P> < P>中,您需要使用RDV作为静态变量,而不是使用<代码> WAITE()/代码>和<代码> NoTIFY()>代码>自己,考虑使用

μ…我是唯一一个注意到你实际上没有开始任何线程的人吗

    new Runnable() {
        public void run() {
            A a = new A(rdv);
            a.someMethod();
        }
    }.run();
应该是

 Thread t = new Thread(
    new Runnable() {
        public void run() {
            A a = new A(rdv);
            a.someMethod();
        }
    });
 t.start();

如果您想让4个线程等待,则应该执行4次。

代码中有许多错误。最重要的一点是,您只有一个线程:主线程。阅读java教程中的并发性:一旦你了解了本教程中的所有内容,就考虑使用Toel.Cube()。但这正是我需要的。非常感谢:)。
 Thread t = new Thread(
    new Runnable() {
        public void run() {
            A a = new A(rdv);
            a.someMethod();
        }
    });
 t.start();