2

我在使用wait()and时遇到了一些麻烦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().

我不明白怎么做

4

4 回答 4

6

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

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

private CountDownLatch rendezvousPoint = new CountDownLatch(4);

//wait for threads
rendezvousPoint.await();

//do stuff after rendezvous

//in the other 4 threads:
rendezvousPoint.countDown();
于 2012-01-20T17:11:09.357 回答
3

嗯...我是唯一一个注意到您实际上没有启动任何线程的人吗?

    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 次。

于 2012-01-20T17:18:24.510 回答
2

与其自欺欺人wait(),不如notify()考虑使用CountDownLatch

于 2012-01-20T17:13:13.723 回答
1

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

您需要在 A 类中使用 RDV 作为静态变量

于 2012-01-20T17:11:59.357 回答