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();