Java Object notify() Method

Java String类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

  • None 。

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() { //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 the element is present 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 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 String类Java Object Class

Other Extensions