Java.lang.Object.wait() 方法

描述

java.lang.Object.wait() 导致当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。 换句话说,这个方法的行为就像它只是执行调用 wait(0) 一样。

当前线程必须拥有该对象的监视器。 线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

该方法只能由作为该对象监视器所有者的线程调用。 有关线程可以成为监视器所有者的方式的描述,请参见 notify 方法。


声明

以下是 java.lang.Object.wait() 方法的声明。

public final void wait()

参数

NA


返回值

此方法不返回值。


异常

  • IllegalMonitorStateException − 如果当前线程不是对象监视器的所有者。

  • InterruptedException − 如果另一个线程中断了当前线程。 抛出此异常时清除当前线程的中断状态。


示例

下面的例子展示了 lang.Object.wait() 方法的使用。

package com.tutorialspoint;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class ObjectDemo extends Object {

   private List synchedList;

   public ObjectDemo() {
      // create a new synchronized list to be used
      synchedList = Collections.synchronizedList(new LinkedList());
   }

   // method used to remove an element from the list
   public String removeElement() throws InterruptedException {
      synchronized (synchedList) {

         // while the list is empty, wait
         while (synchedList.isEmpty()) {
            System.out.println("List is empty...");
            synchedList.wait();
            System.out.println("Waiting...");
         }
         String element = (String) synchedList.remove(0);

         return element;
      }
   }

   // method to add an element in the list
   public void addElement(String element) {
      System.out.println("Opening...");
      synchronized (synchedList) {

         // add an element and notify all that an element exists
         synchedList.add(element);
         System.out.println("New Element:'" + element + "'");

         synchedList.notifyAll();
         System.out.println("notifyAll called!");
      }
      System.out.println("Closing...");
   }

   public static void main(String[] args) {
      final ObjectDemo demo = new ObjectDemo();

      Runnable runA = new Runnable() {

         public void run() {
            try {
               String item = demo.removeElement();
               System.out.println("" + item);
            } catch (InterruptedException ix) {
               System.out.println("Interrupted Exception!");
            } catch (Exception x) {
               System.out.println("Exception thrown.");
            }
         }
      };

      Runnable runB = new Runnable() {

         // run adds an element in the list and starts the loop
         public void run() {
            demo.addElement("Hello!");
         }
      };

      try {
         Thread threadA1 = new Thread(runA, "A");
         threadA1.start();

         Thread.sleep(500);

         Thread threadA2 = new Thread(runA, "B");
         threadA2.start();

         Thread.sleep(500);

         Thread threadB = new Thread(runB, "C");
         threadB.start();

         Thread.sleep(1000);

         threadA1.interrupt();
         threadA2.interrupt();
      } catch (InterruptedException x) {
      }
   }
}

让我们编译并运行上面的程序,这将产生下面的结果 −

List is empty...
List is empty...
Opening...
New Element:'Hello!'
notifyAll called!
Closing...
Waiting...
Hello!
Waiting...
List is empty...
Interrupted Exception!