Java Object notify() Method
Java Object Class
The Object notify() method is used to wake up a thread waiting on this object's monitor.
If all threads are waiting on this object, only one thread will be selected. The selection is arbitrary and occurs when the implementation makes a decision.
A thread can call the wait() method to wait on an object's monitor.
The notify() method can only be called by a thread that is the owner of this object's monitor.
For a thread to become the owner of an object's monitor, it can use the following 3 methods:
- Executing a synchronized instance method of the object
- Using the synchronized built-in lock
- For Class-type objects, executing a synchronized static method
Only one thread can own an object's monitor at a time.
If the current thread is not the owner of this object's monitor, it will throwIllegalMonitorStateExceptionan exception.
Syntax
public final void notify()
Parameters
Return Value
No return value.
Example
The following example demonstrates the use of the notify() method:
Example
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("List is empty...");
synchedList.wait();
System.out.println("Waiting...");
}
String element = (String) synchedList.remove(0);
return element;
}
}
public void addElement(String element) {
System.out.println("Opening...");
synchronized (synchedList) {
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() {
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 output 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 Object Class
Other Extensions