The Object class in java contains three final methods that allows threads to communicate about the lock status of a resource. These methods arewait(),notify()andnotifyAll(). So today we will look into wait, notify and notifyAll in java program.
The current thread which invokes these methods on any object should have the objectmonitorelse it throwsjava.lang.IllegalMonitorStateExceptionexception.
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.
Exampe:
Message
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
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
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
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"); } }
Output
If we comment the notify() call and uncomment the notifyAll() call in Notifier class, below will be the output produced.
Similar Posts:
- Concurrent notes (4): Notes on the use of wait / notify / notifyAll method
- [Two Solutions] non-static method xxx() cannot be referenced from a static context
- [Solved] Java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
- [Solved] Java Call Error: java.lang.IllegalArgumentException: wrong number of arguments
- [Problems with the use of internal classes] No enclosing instance of type Outer is accessible. Must qualify the allocation with an enclo
- Java error: No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
- Object not locked by thread before notify() in onPostExecute
- Convert Object to List>, avoiding Unchecked cast: ‘java.lang.Object’ to ‘java.util.List
- Analysis of Android sleep wake mechanism — wake_ lock
- [Solved] Exception in thread “main” java.util.ConcurrentModificationException