Java 中 wait()、notify() 和 notifyAll() 方法的重要性?

javaobject oriented programmingprogramming更新于 2025/6/22 7:08:17

Java 中线程可以通过 wait()、notify() 和 notifyAll() 方法相互通信。这些是 Object  类中定义的 final  方法,只能在 synchronized  上下文中调用。wait() 方法使当前线程等待,直到另一个线程调用该对象的 notify()  或 notifyAll()  方法。notify() 方法唤醒正在等待该对象监视器的单个线程。 notifyAll() 方法唤醒所有等待该对象监视器的线程。线程通过调用 wait()  方法之一等待对象的监视器。如果当前线程不是对象监视器的所有者,这些方法可能会抛出 IllegalMonitorStateException 。

wait() 方法语法

public final void wait() 抛出 InterruptedException

notify() 方法语法

public final void notify()

NotifyAll() 方法语法

public final void notifyAll()

示例

public class WaitNotifyTest {
   private static final long SLEEP_INTERVAL = 3000;
   private boolean running = true;
   private Thread thread;
   public void start() {
      print("Inside start() method");
      thread = new Thread(new Runnable() {
         @Override
         public void run() {
            print("Inside run() method");
            try {
               Thread.sleep(SLEEP_INTERVAL);
            } catch(InterruptedException e) {
               Thread.currentThread().interrupt();
            }
            synchronized(WaitNotifyTest.this) {
               running = false;
               WaitNotifyTest.this.notify();
            }
         }
      });
      thread.start();
   }
   public void join() throws InterruptedException {
      print("Inside join() method");
      synchronized(this) {
         while(running) {
            print("Waiting for the peer thread to finish.");
            wait(); //waiting, not running
         }
         print("Peer thread finished.");
      }
   }
   private void print(String s) {
      System.out.println(s);
   }
   public static void main(String[] args) throws InterruptedException {
      WaitNotifyTest test = new WaitNotifyTest();
      test.start();
      test.join();
   }
}

输出

Inside start() method
Inside join() method
Waiting for the peer thread to finish.
Inside run() method
Peer thread finished.

相关文章


有用资源