Java Object notify() 方法

Java Object notify() 方法Java Object 类


Object notify() 方法用于唤醒一个在此对象监视器上等待的线程。

如果所有的线程都在此对象上等待,那么只会选择一个线程,选择是任意性的,并在对实现做出决定时发生。

一个线程在对象监视器上等待可以调用 wait() 方法。

notify() 方法只能被作为此对象监视器的所有者的线程来调用。

一个线程要想成为对象监视器的所有者,可以使用以下 3 种方法:

  • 执行对象的同步实例方法
  • 使用 synchronized 内置锁
  • 对于 Class 类型的对象,执行同步静态方法

一次只能有一个线程拥有对象的监视器。

如果当前线程不是此对象监视器的所有者的话会抛出 IllegalMonitorStateException 异常。

语法

public final void notify()

参数

返回值

没有返回值。

实例

以下实例演示了 notify() 方法的使用:

实例

importjava.util.Collections; importjava.util.LinkedList; importjava.util.List; publicclassRunoobTest{privateListsynchedList; publicRunoobTest(){// 创建一个同步列表synchedList = Collections.synchronizedList(newLinkedList()); }// 删除列表中的元素publicStringremoveElement()throwsInterruptedException{synchronized(synchedList){// 列表为空就等待while(synchedList.isEmpty()){System.out.println("List is empty..."); synchedList.wait(); System.out.println("Waiting..."); }Stringelement = (String)synchedList.remove(0); returnelement; }}// 添加元素到列表publicvoidaddElement(Stringelement){System.out.println("Opening..."); synchronized(synchedList){// 添加一个元素,并通知元素已存在synchedList.add(element); System.out.println("New Element:'" + element + "'"); synchedList.notifyAll(); System.out.println("notifyAll called!"); }System.out.println("Closing..."); }publicstaticvoidmain(String[]args){finalRunoobTestdemo = newRunoobTest(); RunnablerunA = newRunnable(){publicvoidrun(){try{Stringitem = demo.removeElement(); System.out.println("" + item); }catch(InterruptedExceptionix){System.out.println("Interrupted Exception!"); }catch(Exceptionx){System.out.println("Exception thrown."); }}}; RunnablerunB = newRunnable(){// 执行添加元素操作,并开始循环publicvoidrun(){demo.addElement("Hello!"); }}; try{ThreadthreadA1 = newThread(runA, "Google"); threadA1.start(); Thread.sleep(500); ThreadthreadA2 = newThread(runA, "Runoob"); threadA2.start(); Thread.sleep(500); ThreadthreadB = newThread(runB, "Taobao"); threadB.start(); Thread.sleep(1000); threadA1.interrupt(); threadA2.interrupt(); }catch(InterruptedExceptionx){}}}

以上程序执行结果为:

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

Java Object notify() 方法Java Object 类