Tutorial

Java Thread wait, notify and notifyAll Example

Published on August 3, 2022
author

Pankaj

Java Thread wait, notify and notifyAll Example

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.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the author(s)

Category:
Tutorial
Tags:

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.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
August 21, 2013

Why wait(),notify(),notifyAll() are in object class?please reply…Thanks

- Nitya

JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
March 23, 2014

In inter thread communication, all the thread share locks among them and every object has one lock. All these 3 final methods are related to lock and object has a lock.

- Divya

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    May 1, 2020

    In Java every Object has a monitor and wait, notify methods are used to wait for the Object monitor or to notify other threads that Object monitor is free now. There is no monitor on threads in java and synchronization can be used with any Object, that’s why it’s part of Object class so that every class in java has these essential methods for inter thread communication.

    - Manjunath

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      October 11, 2013

      The program is good but in that on miss take we have to set the wait time in waiter class other wise it will go for idel sleep time. so in that we have to set the time.

      - sandeep

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        November 8, 2013

        thank you very much.It is really helpful

        - Rajendra Verma

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          November 19, 2013

          i have a doubt here… In waiter class,waiter got a lock on msg object using synchronized(msg).Now waiter1 has been started also…How can waiter1 get the lock again on msg object using synchronized(msg) when waiter is already holding lock on msg object

          - Ruhina

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          November 20, 2013

          When msg.wait() method is called, Waiter threads are releasing the lock on msg. Now when notify() method is called in Notifier thread, only one of the thread gets notified and other threads are in wait state. When notifyAll() method is called, all the waiter threads are getting notified and then one of them gets the lock on msg and process. Once the first waiter thread releases the lock on msg, second thread gets the lock and completes it’s processing.

          - Pankaj

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            December 2, 2019

            This is the flaw in this program because once waiter1 has a lock on msg Then again the lock on msg can’t be given on msg again For this we jave to create one more object msg2 of Message type to give lock to waiter2.

            - Ravi Prakash

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              December 12, 2013

              Thanks sir…it was realyyyyyy helpful…god bless u for ur effort

              - Jaykishan

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                January 20, 2014

                Thanks a lot for making it simple to understand

                - Rudi

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  April 25, 2014

                  Thanks a lot… It really cleared my confusion

                  - Anind

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    May 9, 2014

                    Excellent examples… continue more on collections…if you have blogs already please give link here Thanks & Regards, Vignesh Kanna M S/w Eng, Chennai, India.

                    - Vignesh Kanna M

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    May 10, 2014

                    check the footer links, you will find tutorial on collections.

                    - Pankaj

                      JournalDev
                      DigitalOcean Employee
                      DigitalOcean Employee badge
                      May 13, 2014

                      Thanks for this article. Really helpful for freshers and experienced people. In your next article please come up with some real time scenarios which you have faced in development in the next article through which increases in clarity of concept.

                      - Nanda

                        JournalDev
                        DigitalOcean Employee
                        DigitalOcean Employee badge
                        June 6, 2014

                        Hi pankaj and All, i have one requirement in threads. Requirement: i have three threads.so how to make sure that one thread is exeucted after another.ie thread1 followed bye thread two =>is followed by threade three. please help me

                        - chandu

                        JournalDev
                        DigitalOcean Employee
                        DigitalOcean Employee badge
                        November 22, 2014

                        Don’t use multiple threads. Just do the work that you want done by thread 1 followed by the work you want done by thread2 followed by the work you want done by thread 3. Make it synchronous … why add the complexity of Threading, when you don’t need parallel processing?

                        - Mark Gonzalez

                          JournalDev
                          DigitalOcean Employee
                          DigitalOcean Employee badge
                          June 6, 2014

                          how to make sure that one thread is executed onther(multiple threads).

                          - chandu

                            JournalDev
                            DigitalOcean Employee
                            DigitalOcean Employee badge
                            December 31, 2014

                            Simple and Clear Explanation. Thank You !

                            - Sudarsan

                              JournalDev
                              DigitalOcean Employee
                              DigitalOcean Employee badge
                              January 5, 2015

                              Thanks a lot for your great job share java to us. In this article, Other two variances puts the current thread in ‘wait’ for specific amount of time before ‘they’ wake up. Maybe it should be ‘it’ wake up? Or puts the current thread in ‘wait sets’? Looking forward to your response!

                              - byboating

                                JournalDev
                                DigitalOcean Employee
                                DigitalOcean Employee badge
                                January 9, 2015

                                Hi Sir, Could you share or refer some code of how wait , join , notify used in project . even though i have go through the tutorials and understand what you said, however, i have no idea how to put these into my project.

                                - Paul Yang

                                  JournalDev
                                  DigitalOcean Employee
                                  DigitalOcean Employee badge
                                  February 13, 2015

                                  Thankyou for the tutorial. I have read that we should always use wait in loop ., to prevent false notification . If I am wrong .Please let me know…

                                  - rajesh

                                    JournalDev
                                    DigitalOcean Employee
                                    DigitalOcean Employee badge
                                    April 28, 2015

                                    Thanks. Its a very nice example…

                                    - Abha

                                      JournalDev
                                      DigitalOcean Employee
                                      DigitalOcean Employee badge
                                      May 21, 2015

                                      Excellent example… waited for long time to see such example.

                                      - vijayaraja

                                        JournalDev
                                        DigitalOcean Employee
                                        DigitalOcean Employee badge
                                        June 10, 2015

                                        Straight forward example thanks a lot.

                                        - Pruthvi Raj

                                          JournalDev
                                          DigitalOcean Employee
                                          DigitalOcean Employee badge
                                          June 21, 2015

                                          I am confused that waiter and notifier all use “sychronized” on the same “msg” object. It seems that the syschronized code block will block the thread, and there should be only 1 of the 3 threads fetch the msg object at any time. But, in fact things don’t go on as my imagination, and 3 threads can reach synchronized code cocurrently… please explain this, thansk a lot~

                                          - lz

                                            JournalDev
                                            DigitalOcean Employee
                                            DigitalOcean Employee badge
                                            July 21, 2015

                                            Simply Superb!!

                                            - Raghava

                                              Try DigitalOcean for free

                                              Click below to sign up and get $200 of credit to try our products over 60 days!

                                              Sign up

                                              Join the Tech Talk
                                              Success! Thank you! Please check your email for further details.

                                              Please complete your information!

                                              Become a contributor for community

                                              Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                                              DigitalOcean Documentation

                                              Full documentation for every DigitalOcean product.

                                              Resources for startups and SMBs

                                              The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                                              Get our newsletter

                                              Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                                              New accounts only. By submitting your email you agree to our Privacy Policy

                                              The developer cloud

                                              Scale up as you grow — whether you're running one virtual machine or ten thousand.

                                              Get started for free

                                              Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                                              *This promotional offer applies to new accounts only.