我知道关于这个主题有一些线程是开放的,但我只是在寻找一个非常简单的例子,说明如何在Java中使用wait()和notify()。通过“非常元素”,我的意思是简单地打印出来。感谢。
编辑:这是我到目前为止尝试过的,我得到了一个IllegalMonitorStateException:
public void waiting() {
for(int i = 0; i < 10; i++) {
if(i == 5)
try {
this.wait();
} catch (InterruptedException e) {
}
else
System.out.println(i);
}
System.out.println("notify me now");
this.notify();
}
public void waiting() {
for(int i = 0; i < 10; i++) {
if(i == 5)
try {
this.wait();
} catch (InterruptedException e) {
}
else
System.out.println(i);
}
System.out.println("notify me now");
this.notify();
}
答案 0 :(得分:4)
等待和通知用于同步块,同时使用线程暂停并从中断处继续。
等待立即失去锁定,而Nofity只会在遇到结束括号时离开锁定。
public class Mythread implements Runnable{
public synchronized void goo(){
System.out.println("Before Wait");
wait();
System.out.println("After Wait");
}
public synchronized void foo(){
System.out.println("Before Notify");
notify();
System.out.println("After Notify");
}
public class Test{
public static void main(String[] args){
Thread t = new Thread(new Mythread);
t.start();
}
}
答案 1 :(得分:2)
您的IllegalMonitorStateException是由于您必须在调用wait或notify之前同步对象。所以
this.wait
需要
synchronized(this) {
this.wait();
}
您的示例将无法运行,因为您永远不会进入notify
调用...一旦您的线程等待,它将暂停并不再前进。要使wait / notify工作,您必须有两个线程。一个线程在调用wait
方法时挂起,最终,第二个线程调用synchronized(this) { this.notify() }
以使第一个线程唤醒并在等待调用之下继续执行。
同步是必需的,因为您通常会在等待之前检查某些条件,即
synchronized(this) {
if(! this.isReady) {
this.wait();
}
}
您需要进行同步以确保没有其他线程更改检查变量的行与您等待的行之间的isReady标志的状态。所以你的通知代码
synchronized(this) {
isReady = true;
this.notify();
}
现在方法调用的顺序无关紧要。如果你先通知,没有线程会被唤醒,但没关系,因为你不会睡觉因为isReady = true。如果你先睡觉,isReady = true什么也不做,但是通知调用会唤醒线程。最后,同步确保您不检查线程A中的变量,然后让线程B设置变量并通知(什么也不做),然后让线程A进入休眠状态并且永远不会唤醒。
希望有所帮助。
答案 2 :(得分:1)
wait()
和notify()
用于同步线程:线程可以告诉wait()
,并且在收到notify()
调用之前不会继续执行任何操作。< / p>
答案 3 :(得分:0)
这些函数的基本思想是wait()
挂起一个线程(让它进入休眠状态),notify()
使一个线程在它进入休眠状态时从它离开的地方获取。
答案 4 :(得分:0)
请查看:this或在Google上查找simple prodcuer consumer problem java
。我相信你会找到适合你需求的东西。
答案 5 :(得分:0)
请参阅oracle java网站上有关受保护块的this example - 它包含一个a simple producer-consumer problem的工作示例。