Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用wait()/notify()_Java_Wait_Notify - Fatal编程技术网

如何在Java中使用wait()/notify()

如何在Java中使用wait()/notify(),java,wait,notify,Java,Wait,Notify,我知道有一些关于这个主题的线程是开放的,但我只是在寻找一个关于如何在Java中使用wait()和notify()的非常基本的示例。我所说的“非常基本”,是指简单地打印出一些东西。谢谢 编辑:以下是我迄今为止尝试过的,我得到了一个非法MonitorStateException: public void waiting(){ 对于(int i=0;i

我知道有一些关于这个主题的线程是开放的,但我只是在寻找一个关于如何在Java中使用wait()和notify()的非常基本的示例。我所说的“非常基本”,是指简单地打印出一些东西。谢谢

编辑:以下是我迄今为止尝试过的,我得到了一个非法MonitorStateException:

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-vis
synchronized
   synchronized(this) {
      isReady = true;
      this.notify();
   }