// Tutorial //

Java Thread wait, notify and notifyAll Example

Published on August 3, 2022
Default avatar
By Pankaj
Developer and author at DigitalOcean.
Java Thread wait, notify and notifyAll Example

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

The Object class in java contains three final methods that allows threads to communicate about the lock status of a resource. These methods are wait(), notify() and notifyAll(). So today we will look into wait, notify and notifyAll in java program.

wait, notify and notifyAll in Java

wait and notify in java, wait notify and notifyAll in java, wait notify example, java thread wait The current thread which invokes these methods on any object should have the object monitor else it throws java.lang.IllegalMonitorStateException exception.

wait

Object wait methods has three variance, one which waits indefinitely for any other thread to call notify or notifyAll method on the object to wake up the current thread. Other two variances puts the current thread in wait for specific amount of time before they wake up.

notify

notify method wakes up only one thread waiting on the object and that thread starts execution. So if there are multiple threads waiting for an object, this method will wake up only one of them. The choice of the thread to wake depends on the OS implementation of thread management.

notifyAll

notifyAll method wakes up all the threads waiting on the object, although which one will process first depends on the OS implementation. These methods can be used to implement producer consumer problem where consumer threads are waiting for the objects in Queue and producer threads put object in queue and notify the waiting threads. Let’s see an example where multiple threads work on the same object and we use wait, notify and notifyAll methods.

Message

A java bean class on which threads will work and call wait and notify methods.

package com.journaldev.concurrency;

public class Message {
    private String msg;
    
    public Message(String str){
        this.msg=str;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String str) {
        this.msg=str;
    }

}

Waiter

A class that will wait for other threads to invoke notify methods to complete it’s processing. Notice that Waiter thread is owning monitor on Message object using synchronized block.

package com.journaldev.concurrency;

public class Waiter implements Runnable{
    
    private Message msg;
    
    public Waiter(Message m){
        this.msg=m;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        synchronized (msg) {
            try{
                System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis());
                msg.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis());
            //process the message now
            System.out.println(name+" processed: "+msg.getMsg());
        }
    }

}

Notifier

A class that will process on Message object and then invoke notify method to wake up threads waiting for Message object. Notice that synchronized block is used to own the monitor of Message object.

package com.journaldev.concurrency;

public class Notifier implements Runnable {

    private Message msg;
    
    public Notifier(Message msg) {
        this.msg = msg;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name+" started");
        try {
            Thread.sleep(1000);
            synchronized (msg) {
                msg.setMsg(name+" Notifier work done");
                msg.notify();
                // msg.notifyAll();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
    }

}

WaitNotifyTest

Test class that will create multiple threads of Waiter and Notifier and start them.

package com.journaldev.concurrency;

public class WaitNotifyTest {

    public static void main(String[] args) {
        Message msg = new Message("process it");
        Waiter waiter = new Waiter(msg);
        new Thread(waiter,"waiter").start();
        
        Waiter waiter1 = new Waiter(msg);
        new Thread(waiter1, "waiter1").start();
        
        Notifier notifier = new Notifier(msg);
        new Thread(notifier, "notifier").start();
        System.out.println("All the threads are started");
    }

}

When we will invoke the above program, we will see below output but program will not complete because there are two threads waiting on Message object and notify() method has wake up only one of them, the other thread is still waiting to get notified.

waiter waiting to get notified at time:1356318734009
waiter1 waiting to get notified at time:1356318734010
All the threads are started
notifier started
waiter waiter thread got notified at time:1356318735011
waiter processed: notifier Notifier work done

If we comment the notify() call and uncomment the notifyAll() call in Notifier class, below will be the output produced.

waiter waiting to get notified at time:1356318917118
waiter1 waiting to get notified at time:1356318917118
All the threads are started
notifier started
waiter1 waiter thread got notified at time:1356318918120
waiter1 processed: notifier Notifier work done
waiter waiter thread got notified at time:1356318918120
waiter processed: notifier Notifier work done

Since notifyAll() method wake up both the Waiter threads and program completes and terminates after execution. That’s all for wait, notify and notifyAll in java.

If you’ve enjoyed this tutorial and our broader community, consider checking out our DigitalOcean products which can also help you achieve your development goals.

Learn more here


About the authors
Default avatar
Pankaj

author

Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?

Hi - it might be late query. I have tried test class as below and it is not notifying even single waiter thread. If i copy samea above client test code ,it is working. Please help somebody why it is not able to notify new Thread(new Waiter(new Message(“Process It”)),“WaiterThread1”).start(); new Thread(new Waiter(new Message(“Process It”)),“WaiterThread2”).start(); new Thread(new Notifier(new Message(“Process It”)),“NotifierThread”).start(); System.out.println(“ALL THREADS ARE STARTED”);

- Lakshman

    Hi, Does any one know why if you include a println statement in the run method of the waiter class before the synchronized block like in the notifier class the thread keeps blocked?, for example: public void run() { String name = Thread.currentThread().getName(); System.out.println(“Test”); //------------------------------------> This one keeps the thread blocked. synchronized (msg) { try{ System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis()); msg.wait(); }catch(InterruptedException e){ e.printStackTrace(); } Thanks!!!

    - Armando

      Journal Dev has been always the best portfolio for me to learn and brush up concepts with hands on example in a simpler and easy way.Thank You So so much.

      - Sachin Pradhan

        Hello Sir, Your content and the way of explaining the things is awesome. I like everything of this tutorial except that why there are this much ads in this website? Like it’s very annoying. Also it slow down the speed.

        - Sanjana Chourishi

          Example public class Data { int msg; boolean valueSet=false; public synchronized void get() { try {Thread.sleep(3000);}catch(Exception e) {} while(!valueSet) { try {wait();}catch(Exception e) {} } System.out.println(“Consume :”+msg); valueSet=false; notify(); } public synchronized void set(int msg) { try {Thread.sleep(3000);}catch(Exception e) {} while(valueSet) { try {wait();}catch(Exception e) {} } this.msg=msg; System.out.println(“Produce :”+msg); valueSet=true; notify(); } } -------------------------------------------------------------------------------- public class Producer implements Runnable{ Data d; Producer(Data d){ this.d=d; new Thread(this,“Producer”).start(); } public void run() { int i=1; while(true) { d.set(i++); } } } ------------------------------------------------------------------------ public class Consumer implements Runnable { Data d; boolean ValueSet=false; Consumer(Data d){ this.d=d; new Thread(this,“Consumer”).start(); } public void run() { while(true) { d.get(); } } } ------------------------------------------------------------- public class InterThread { public static void main(String[] args) { // TODO Auto-generated method stub Data d=new Data(); new Producer(d); new Consumer(d); } }

          - sagar

            Hi Sir, My question is very simple Why “wait” method is there in object class bcz of we are mostly using in wait method in thread class and is there any reason apart from thread u can also use "wait"method in other place then please write the few code without using the thread concept

            - pratap singh

              Hey, still on the Notify exaple (notiftyAll commented out). How can I check something like “if one of them is stuck, release it”? I tried the following: if (t1.isAlive() ^ t2.isAlive) // one of them is alive and the other finished msg.notify(); But that doesn’t really do anything. (What I’m asking is, how to terminate the program “safely” because we know for sure some thread is stuck. Also, is this a case of starvation?)

              - Yoad

                Hi Pankaj, Can you also please explain the usage of Condition methods in place of wait(), notify() and notifyAll()?

                - Mahdavi

                  The wait() method has to be invoked in a loop, right?

                  - Vignesh M

                    This will not work all the time. If the notifier thread get the lock first, its notify call will be ignored and other threads will always be waiting.

                    - Java Dev