Easy Tutorial
❮ Data Vecsort Java Generics ❯

Java Object notifyAll() Method

Java Object Class


The Object notifyAll() method is used to wake up all threads that are waiting on the object.

Similar to the notify() method, the difference is that notifyAll() wakes up all threads waiting on the object's monitor, while notify() wakes up a single thread.

If the current thread is not the owner of the object's monitor, calling the notifyAll() method will result in an IllegalMonitorStateException.

Syntax

public final void notifyAll()

Parameters

Return Value

No return value.

Example

The following example demonstrates the use of the notifyAll() method:

Example

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class tutorialproTest {

    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 adds an element in the list and starts the loop
            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 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 Object Class ```

❮ Data Vecsort Java Generics ❯