如何在Java中使用wait()/notify()
我知道有一些关于这个主题的线程是开放的,但我只是在寻找一个关于如何在Java中使用wait()和notify()的非常基本的示例。我所说的“非常基本”,是指简单地打印出一些东西。谢谢 编辑:以下是我迄今为止尝试过的,我得到了一个非法MonitorStateException:如何在Java中使用wait()/notify(),java,wait,notify,Java,Wait,Notify,我知道有一些关于这个主题的线程是开放的,但我只是在寻找一个关于如何在Java中使用wait()和notify()的非常基本的示例。我所说的“非常基本”,是指简单地打印出一些东西。谢谢 编辑:以下是我迄今为止尝试过的,我得到了一个非法MonitorStateException: public void waiting(){ 对于(int i=0;i
public void waiting(){
对于(int i=0;i<10;i++){
如果(i==5)
试一试{
这个。等等();
}捕捉(中断异常e){
}
其他的
系统输出打印LN(i);
}
System.out.println(“立即通知我”);
this.notify();
}
wait()
和notify()
用于同步线程:线程可以被告知wait()
,并且在收到notify()
调用之前不会继续执行任何操作。这些函数的基本思想是wait()
挂起线程(使其进入睡眠状态),而notify()
会使线程在进入睡眠状态时找到它离开的地方。看看:或者在google上查找简单的prodcuer消费者问题java
。我相信您会找到适合您需要的东西。请参阅oracle java站点上的“受保护的块”-其中包括一个工作示例。在同步块中使用等待和通知,同时使用线程挂起并恢复停止的位置
等待会立即松开锁,而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或notify之前对对象进行同步。所以
这个。等等
需要
synchronized(this) {
this.wait();
}
您的示例将无法运行,因为您永远无法访问notify
调用。。。一旦线程点击wait,它将暂停并不再前进。要使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进入睡眠状态,永远不会醒来
希望能有所帮助。是的,但我正在寻找一个例子。@JackRadcliffe您自己尝试过什么吗?是的,我已将其添加到原始帖子中。回想起来,我的尝试没有任何意义,因为在等待之后,它从未离开循环。请注意,notify()会唤醒1个线程,而notifyAll()会唤醒1个线程唤醒在给定对象上等待的所有线程。@jrad如何使用?你的意思只是使用
wait()
/notify()
的机制?看起来,您想知道何时使用wait()
/notify()
vis-a-vissynchronized
?
synchronized(this) {
isReady = true;
this.notify();
}