Метод notify() класса Object в Java
Класс Object в Java
Метод notify() класса Object используется для пробуждения потока, ожидающего на мониторе этого объекта.
Если все потоки ожидают на этом объекте, будет выбран только один поток. Выбор произволен и происходит, когда реализация принимает решение.
Поток может вызвать метод wait(), чтобы ожидать на мониторе объекта.
Метод notify() может быть вызван только потоком, который является владельцем монитора этого объекта.
Чтобы поток стал владельцем монитора объекта, он может использовать следующие 3 метода:
- Выполнение synchronized метода экземпляра объекта
- Использование встроенной блокировки synchronized
- Для объектов типа Class — выполнение synchronized статического метода
Только один поток может владеть монитором объекта одновременно.
Если текущий поток не является владельцем монитора этого объекта, он выброситIllegalMonitorStateException— исключение.
Синтаксис
public final void notify()
Parameters
Возвращаемое значение
Нет возвращаемого значения.
Пример
В следующем примере демонстрируется использование метода notify():
Пример
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
Другие расширения