Метод notifyAll() класса Object в Java
Метод notifyAll() класса Object используется для пробуждения всех потоков, ожидающих этот объект.
Метод notifyAll() похож на методnotify(),Разница в том, что метод notifyAll() пробуждает все потоки, ожидающие монитор данного объекта, тогда как метод notify() пробуждает один поток.
Если текущий поток не является владельцем монитора объекта, вызов метода notifyAll() также выброситIllegalMonitorStateExceptionисключение.
Синтаксис
public final void notifyAll()
Parameters
Отсутствует 。
Возвращаемое значение
Нет возвращаемого значения.
Пример
В следующем примере демонстрируется использование метода notifyAll():
Пример
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class ExampleTest {
private List synchedList;
public ExampleTest() {
//Создать синхронизированный список
synchedList = Collections.synchronizedList(new LinkedList());
}
//Удалить элемент из списка
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
//Подождать, если список пуст
while (synchedList.isEmpty()) {
System.out.println("Список пуст...");
synchedList.wait();
System.out.println("Ожидание...");
}
String element = (String) synchedList.remove(0);
return element;
}
}
//Добавить элемент в список
public void addElement(String element) {
System.out.println("Открытие...");
synchronized (synchedList) {
//Добавить элемент и уведомить, что элемент существует
synchedList.add(element);
System.out.println("Новый элемент:'" + element + "'");
synchedList.notifyAll();
System.out.println("notifyAll вызван!");
}
System.out.println("Закрытие...");
}
public static void main(String[] args) {
final ExampleTest demo = new ExampleTest();
Runnable runA = new Runnable() {
public void run() {
try {
String item = demo.removeElement();
System.out.println("" + item);
} catch (InterruptedException ix) {
System.out.println("Исключение прерывания!");
} catch (Exception x) {
System.out.println("Исключение выброшено.");
}
}
};
Runnable runB = new Runnable() {
//Выполните операцию добавления элемента и запустите цикл
public void run() {
demo.addElement("Привет!");
}
};
try {
Thread threadA1 = new Thread(runA, "Google");
threadA1.start();
Thread.sleep(500);
Thread threadA2 = new Thread(runA, "Example");
threadA2.start();
Thread.sleep(500);
Thread threadB = new Thread(runB, "Taobao");
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... Waiting... List is empty... Hello! Interrupted Exception!
Другие расширения
Класс Object в Java