Java Object wait() Method
The wait()
method of the Object class causes the current thread to wait until another thread invokes the notify()
method or the notifyAll()
method for this object.
The current thread must be the owner of this object's monitor, otherwise an IllegalMonitorStateException
will be thrown.
If the current thread is interrupted by any thread before or while it is waiting, an InterruptedException
will be thrown.
Syntax
public final void wait()
Parameters
- None.
Return Value
This method does not return a value.
Example
The following example demonstrates the use of the wait()
method:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class tutorialproTest extends Object {
private List synchedList;
public tutorialproTest() {
// Create a synchronized list
synchedList = Collections.synchronizedList(new LinkedList());
}
// Remove an element from the list
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
// Wait if the list is empty
while (synchedList.isEmpty()) {
System.out.println("List is empty...");
synchedList.wait();
System.out.println("Waiting...");
}
String element = (String) synchedList.remove(0);
return element;
}
}
// Add an element to the list
public void addElement(String element) {
System.out.println("Opening...");
synchronized (synchedList) {
// Add an element and notify that an 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 tutorialproTest demo = new tutorialproTest();
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() {
// Run method for thread B
public void run() {
demo.addElement("Hello!");
}
};
try {
Thread threadA1 = new Thread(runA, "A");
threadA1.start();
Thread.sleep(500);
Thread threadA2 = new Thread(runA, "B");
threadA2.start();
Thread.sleep(500);
Thread threadB = new Thread(runB, "C");
threadB.start();
Thread.sleep(1000);
threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}
System.out.println("Exception thrown.");
}
}
};
Runnable runB = new Runnable() {
// Perform element addition 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, "tutorialpro");
threadA2.start();
Thread.sleep(500);
Thread threadB = new Thread(runB, "Taobao");
threadB.start();
Thread.sleep(1000);
threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}
The above program execution results are:
List is empty...
List is empty...
Opening...
New Element:'Hello!'
notifyAll called!
Closing...
Waiting...
Waiting...
List is empty...
Hello!
Interrupted Exception!