我知道有一些关于这个主题的线程,但我只是在寻找一个关于如何在 Java 中使用 wait() 和 notification() 的非常基本的示例。我所说的“非常基本”是指简单地打印一些东西。谢谢。
编辑:这是我迄今为止所尝试过的,我得到了 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();
}
wait 和notify 用于同步块中,同时使用线程来暂停和恢复。
Wait 会立即松开锁,而 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();
}
}
您的 IllegalMonitorStateException 是由于您必须在调用 wait 或 notification 之前同步对象而导致的。所以
this.wait
需要
synchronized(this) {
this.wait();
}
您的示例将无法运行,因为您永远不会到达
notify
调用...一旦您的线程达到等待状态,它将挂起并不再前进。为了让 wait/notify 工作,你必须有两个线程。当调用 wait
方法时,一个线程会挂起,最终,第二个线程调用 synchronized(this) { this.notify() }
来导致第一个线程唤醒并在 wait 调用下面继续执行。
需要同步,因为您通常会在等待之前检查一些条件,即
synchronized(this) {
if(! this.isReady) {
this.wait();
}
}
您需要同步以确保在检查变量的行和等待的行之间没有其他线程更改 isReady 标志的状态。所以你的通知代码会
synchronized(this) {
isReady = true;
this.notify();
}
现在方法调用的顺序并不重要。如果您先通知,则不会唤醒任何线程,但这没关系,因为自从 isReady = true 后您就不会休眠。如果先进入睡眠状态,isReady = true 什么都不做,但notify 调用会唤醒线程。最后,同步确保您不会检查线程 A 中的变量,然后让线程 B 设置变量并通知(不执行任何操作),然后让线程 A 进入睡眠状态并且永远不会醒来。
希望有帮助。
wait()
和 notify()
用于同步线程:可以告诉线程 wait()
,并且在收到 notify()
调用之前不会继续执行任何操作。
这些函数的基本思想是
wait()
挂起线程(使其进入睡眠状态),而 notify()
使线程从进入睡眠状态时离开的位置继续工作。
看一下:this或在谷歌上查找
simple prodcuer consumer problem java
。我相信您会找到适合您需求的东西。
请参阅来自 oracle java 站点的受保护块上的此示例 - 它包含一个简单的生产者-消费者问题的有效示例。