4

我知道关于这个主题有几个线程打开,但我只是在寻找一个关于如何在 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();
}

4

6 回答 6

4

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

 }
}
于 2012-07-17T16:05:18.047 回答
2

您的 IllegalMonitorStateException 是由于您必须在调用等待或通知之前对对象进行同步。所以

this.wait

需要是

   synchronized(this) {
      this.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 什么都不做,但是 notify 调用会唤醒线程。最后,同步确保您不检查线程 A 中的变量,然后让线程 B 设置变量并通知(什么都不做),然后让线程 A 进入睡眠状态并且永远不会醒来。

希望有帮助。

于 2012-07-17T16:40:47.170 回答
1

wait()notify()用于同步线程:一个线程可以被告知,并且在收到调用wait()之前不会继续做任何事情。notify()

于 2012-07-17T16:00:02.803 回答
0

这些函数的基本思想是wait()挂起一个线程(使其进入睡眠状态),notify()并使一个线程在它进入睡眠状态时从它离开的地方拾取。

于 2012-07-17T16:00:25.503 回答
0

看看:这个或只是在谷歌上查找simple prodcuer consumer problem java。我相信你会找到适合你需要的东西。

于 2012-07-17T16:02:51.670 回答
0

请参阅oracle java 站点的受保护块上的这个示例- 它包括一个简单的生产者-消费者问题的工作示例。

于 2012-07-17T16:03:04.350 回答