Java Object notify() 方法
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!