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


线程可以通过 Java 中的 wait()、notify() 和 notifyAll() 方法相互通信。它们是 Object 类中定义的 final 方法,只能在同步上下文中调用。wait() 方法表示当前线程等待,直到另一个线程为此对象调用 notify() 或 notifyAll() 方法。

notify() 方法唤醒在该对象监视器上等待的单个线程。notifyAll() 方法唤醒在该对象监视器上等待的所有线程。线程通过调用其中一种 wait() 方法来等待对象监视器。如果当前线程不是对象监视器的所有者,则这些方法会引发 IllegalMonitorStateException。

wait() 方法语法

public final void wait() throws 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.

更新日期: 2023-11-27

15,000+ 浏览量

开启您的 事业

完成课程获得认证

开始
广告