Метод wait(long timeout, int nanos) класса Object в Java

Java String类Класс Object в Java


Метод Object wait(long timeout, int nanos) переводит текущий поток в состояние ожидания (блокировки) до тех пор, пока другой поток не вызовет метод notify() или notifyAll() данного объекта, либо пока не будет превышен период ожидания, заданный параметрами timeout и nanos.

Этот метод аналогичен методуwait(long timeout), но имеет дополнительный параметр nanos, который представляет дополнительное время (в наносекундах, диапазон 0-999999). Поэтому к периоду ожидания также нужно добавить nanos наносекунд.

Если оба параметра timeout и nanos равны 0, тайм-аута нет, и ожидание будет продолжаться бесконечно, подобно методуwait()。

Текущий поток должен быть владельцем монитора этого объекта, иначе всё равно возникнетIllegalMonitorStateExceptionисключение.

Если текущий поток будет прерван любым потоком до или во время ожидания, будет выброшеноInterruptedExceptionисключение.

Если переданные параметры недействительны или nanos не находится в диапазоне 0-999999, будет выброшеноIllegalArgumentExceptionисключение.

Синтаксис

public final void wait(long timeout, int nanos)

Parameters

  • timeout- Время ожидания (в миллисекундах).

  • nanos- Дополнительное время ожидания (в наносекундах).

Возвращаемое значение

Нет возвращаемого значения.

Пример

В следующем примере демонстрируется использование метода wait(long timeout, int nanos):

Пример

import java.util.Collections; import java.util.LinkedList; import java.util.List; public class ExampleTest extends Object { private List synchedList; public ExampleTest() { //Создать синхронизированный список synchedList = Collections.synchronizedList(new LinkedList()); } //Удалить элементы из списка public String removeElement() throws InterruptedException { synchronized (synchedList) { //Если список пуст, ждать 10 секунд плюс 500 наносекунд while (synchedList.isEmpty()) { System.out.println("Список пуст..."); synchedList.wait(10000, 500); 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!

Java String类Класс Object в Java

Другие расширения