Inter-thread Comm

Education is not limited to just classrooms. It can be gained anytime, anywhere... - Ravi Ranjan (M.Tech-NIT)

Inter thread communication in Java

Inter-thread communication or Co-operation is all about allowing synchronized threads to communicate with each other.

Cooperation (Inter-thread communication) is a mechanism in which a thread is paused running in its critical section and another thread is allowed to enter (or lock) in the same critical section to be executed. It is implemented by following methods of Object class:

  • wait()
  • notify()
  • notify All()

1) Wait () method

Causes current thread to release the lock and wait until either another thread invokes the notify() method or the notify All() method for this object, or a specified amount of time has elapsed.

The current thread must own this object's monitor, so it must be called from the synchronized method only otherwise it will throw exception.

Method

Description

public final void wait()throws Interrupted Exception

Waits until object is notified.

public final void wait(long timeout)throws Interrupted Exception

Waits for the specified amount of time.

2) notify () method

Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. Syntax:

Public final void notify ()

3) Notify All () method

Wakes up all threads that are waiting on this object's monitor. Syntax:

Public final void notify all ()

Understanding the process of inter-thread communication

inter thread communication in java

The point to point explanation of the above diagram is as follows:

  1. Threads enter to acquire lock.
  2. Lock is acquired by on thread.
  3. Now thread goes to waiting state if you call wait () method on the object. Otherwise it releases the lock and exits.
  4. If you call notify () or notify All () method, thread moves to the notified state (unable state).
  5. Now thread is available to acquire lock.
  6. After completion of the task, thread releases the lock and exits the monitor state of the object.

Why wait (), notify () and notify All () methods are defined in Object class not Thread class?

It is because they are related to lock and object has a lock.

Difference between wait and sleep?

Let's see the important differences between wait and sleep methods.

wait()

sleep()

wait() method releases the lock

sleep () method doesn't release the lock.

is the method of Object class

is the method of Thread class

is the non-static method

is the static method

is the non-static method

is the static method

should be notified by notify() or notify All() methods

After the specified amount of time, sleep is completed.

 

Example of inter thread communication in java

Let's see the simple example of inter thread communication.

  1. class Customer{  
  2. int amount=10000;  
  3.   
  4. synchronized void withdraw(int amount){  
  5. System.out.println("going to withdraw...");  
  6.   
  7. if(this.amount<amount){  
  8. System.out.println("Less balance; waiting for deposit...");  
  9. try{wait();}catch(Exception e){}  
  10. }  
  11. this.amount-=amount;  
  12. System.out.println("withdraw completed...");  
  13. }  
  14.   
  15. synchronized void deposit(int amount){  
  16. System.out.println("going to deposit...");  
  17. this.amount+=amount;  
  18. System.out.println("deposit completed... ");  
  19. notify();  
  20. }  
  21. }  
  22.   
  23. class Test{  
  24. public static void main(String args[]){  
  25. final Customer c=new Customer();  
  26. new Thread(){  
  27. public void run(){c.withdraw(15000);}  
  28. }.start();  
  29. new Thread(){  
  30. public void run(){c.deposit(10000);}  
  31. }.start();  
  32.   
  33. }}  
Output: going to withdraw...
       Less balance; waiting for deposit...
       going to deposit...
       deposit completed...
       withdraw completed