Java Object notifyAll() 方法
Object notifyAll() 方法用于唤醒在该对象上等待的所有线程。
notifyAll() 方法跟 notify() 方法一样,区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程,notify() 方法是一个线程。
如果当前线程不是对象监视器的所有者,那么调用 notifyAll() 方法同样会发生 IllegalMonitorStateException 异常。
语法
public final void notifyAll()
参数
无 。
返回值
没有返回值。
实例
以下实例演示了 notifyAll() 方法的使用:
实例
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!