Java Object wait(long timeout, int nanos) Method

Java String类Java Object Class


The Object wait(long timeout, int nanos) method puts the current thread into a waiting (blocked) state until another thread calls the notify() method or notifyAll() method of this object, or until the timeout period set by the timeout and nanos parameters is exceeded.

This method is similar to thewait(long timeout) methodbut has an additional nanos parameter, which represents extra time (in nanoseconds, range 0-999999). So the timeout period also needs to add nanos nanoseconds.

If both the timeout and nanos parameters are 0, there is no timeout and it will wait indefinitely, similar to thewait() method。

The current thread must be the monitor owner of this object, otherwise anIllegalMonitorStateExceptionexception will still occur.

If the current thread is interrupted by any thread before or while waiting, it will throw anInterruptedExceptionexception.

If the parameters passed are invalid or nanos is not in the range 0-999999, it will throw anIllegalArgumentExceptionexception.

Syntax

public final void wait(long timeout, int nanos)

Parameters

  • timeout- The waiting time (in milliseconds).

  • nanos- The additional waiting time (in nanoseconds).

Return Value

No return value.

Example

The following example demonstrates the use of the wait(long timeout, int nanos) method:

Example

import java.util.Collections; import java.util.LinkedList; import java.util.List; public class ExampleTest extends Object { private List synchedList; public ExampleTest() { //Create a synchronized list synchedList = Collections.synchronizedList(new LinkedList()); } //Delete elements from the list public String removeElement() throws InterruptedException { synchronized (synchedList) { //If the list is empty, wait for 10 seconds plus 500 nanoseconds 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; } } //Add elements to the list public void addElement(String element) { System.out.println("Opening..."); synchronized (synchedList) { //Add an element and notify that the element exists 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 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("Interrupted Exception!"); } catch (Exception x) { System.out.println("Exception thrown."); } } }; Runnable runB = new Runnable() { //Perform the add element operation and start the loop public void run() { demo.addElement("Hello!"); } }; 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) { } } }

The execution result of the above program is:

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

Java String类Java Object Class

Other Extensions