Método Java Object wait(long timeout, int nanos)

Java String类Clase Java Object


El método Object wait(long timeout, int nanos) hace que el hilo actual entre en estado de espera (bloqueo) hasta que otro hilo invoque el método notify() o notifyAll() de este objeto, o hasta que se supere el tiempo de espera establecido por los parámetros timeout y nanos.

Este método es similar almétodo wait(long timeout)similar, pero con un parámetro adicional nanos, que representa tiempo extra (en nanosegundos, con un rango de 0-999999). Por lo tanto, el tiempo de espera debe sumar además nanos nanosegundos.

Si los parámetros timeout y nanos son ambos 0, no habrá tiempo de espera y se esperará indefinidamente, similar almétodo wait()。

El hilo actual debe ser el propietario del monitor de este objeto; de lo contrario, se produciráIllegalMonitorStateExceptionuna excepción.

Si el hilo actual es interrumpido por cualquier hilo antes o durante la espera, se lanzaráInterruptedExceptionuna excepción.

Si los parámetros pasados no son válidos o nanos no está en el rango de 0-999999, se lanzaráIllegalArgumentExceptionuna excepción.

Sintaxis

public final void wait(long timeout, int nanos)

Parámetros

  • timeout- Tiempo de espera (en milisegundos).

  • nanos- Tiempo de espera adicional (en nanosegundos).

Valor de retorno

Sin valor de retorno.

Ejemplo

El siguiente ejemplo demuestra el uso del método wait(long timeout, int nanos):

Ejemplo

import java.util.Collections; import java.util.LinkedList; import java.util.List; public class EjemploTest extends Object { private List synchedList; public EjemploTest() { //Crear una lista sincronizada synchedList = Collections.synchronizedList(new LinkedList()); } //Eliminar elementos de la lista public String removeElement() throws InterruptedException { synchronized (synchedList) { //Si la lista está vacía, esperar 10 segundos más 500 nanosegundos while (synchedList.isEmpty()) { System.out.println("List is empty..."); synchedList.wait(10000, 500); System.out.println("Waiting..."); } String element = (String) synchedList.remove(0); return element; } } //Añadir elementos a la lista public void addElement(String element) { System.out.println("Opening..."); synchronized (synchedList) { //Añadir un elemento y notificar que el elemento ya existe synchedList.add(element); System.out.println("New Element:'" + element + "'"); synchedList.notifyAll(); System.out.println("notifyAll called!"); } System.out.println("Closing..."); } public static void main(String[] args) { final EjemploTest demo = new EjemploTest(); Runnable runA = new Runnable() { public void run() { try { String item = demo.removeElement(); System.out.println("" + item); } catch (InterruptedException ix) { System.out.println("Interrupted Exception!"); } catch (Exception x) { System.out.println("Exception thrown."); } } }; Runnable runB = new Runnable() { //Ejecutar la operación de añadir elementos y comenzar el bucle public void run() { demo.addElement("Hello!"); } }; try { Thread threadA1 = new Thread(runA, "Google"); threadA1.start(); Thread.sleep(500); Thread threadA2 = new Thread(runA, "Ejemplo"); threadA2.start(); Thread.sleep(500); Thread threadB = new Thread(runB, "Taobao"); threadB.start(); Thread.sleep(1000); threadA1.interrupt(); threadA2.interrupt(); } catch (InterruptedException x) { } } }

El resultado de ejecutar el programa anterior es:

List is empty...
List is empty...
Opening...
New Element:'Hello!'
notifyAll called!
Closing...
Waiting...
Waiting...
List is empty...
Hello!
Interrupted Exception!

Java String类Clase Java Object

Otras extensiones