Home Java Thread Inter-Thread Communication

Related Tutorials


 
 

Share on Google+Share on Google+

Inter-Thread Communication

Advertisement
Java provides a very efficient way through which multiple-threads can communicate with each-other

Inter-Thread Communication

     

Java provides a very efficient way through which multiple-threads can communicate with each-other. This way reduces the CPU?s idle time i.e. A process where, a thread is paused running in its critical region and another thread is allowed to enter (or lock) in the same critical section to be executed.  This technique is known as Interthread communication which is implemented by some methods. These methods are defined in "java.lang" package and can only be called  within synchronized code shown as:

 Method  Description
 wait( )  It indicates the calling thread to give up the monitor and go to sleep until some other thread enters the same monitor and calls method notify() or notifyAll().
 notify( )  It wakes up the first thread that called wait() on the same object.
 notifyAll( )  Wakes up (Unloack) all the threads that called wait( ) on the same object. The highest priority thread will run first.

All these methods must be called within a try-catch block.

Lets see an example implementing these methods :

class Shared {

int num=0;
boolean value = false;
  
synchronized int get() {
  if (value==false
  try {
  wait();
  }
  catch (InterruptedException e) {
  System.out.println("InterruptedException caught");
  }
System.out.println("consume: " + num);
value=false;
notify();
return num;
}

synchronized void put(int num) {
  if (value==true
  try {
  wait();
  }
  catch (InterruptedException e) {
  System.out.println("InterruptedException caught");
  }
  this.num=num;
  System.out.println("Produce: " + num);
  value=false;
  notify();
  }
  }

  class Producer extends Thread {
  Shared s;
  
  Producer(Shared s) {
  this.s=s;
  this.start();
  }

  public void run() {
  int i=0;
  
  s.put(++i);
  }
}

class Consumer extends Thread{
  Shared s;
  
  Consumer(Shared s) {
  this.s=s;
  this.start();
  }

  public void run() {
  s.get();
  }
}

public class InterThread{
  public static void main(String[] args) 
  {
  Shared s=new Shared();
  new Producer(s);
  new Consumer(s);
  }
}

Output of the Program:

C:\nisha>javac InterThread.java

C:\nisha>java InterThread
Produce: 1
consume: 1

In this program, two threads "Producer" and "Consumer" share the synchronized methods of the class "Shared". At time of program execution, the "put( )" method is invoked through the "Producer" class which increments the variable "num" by 1. After producing 1 by the producer, the method "get( )" is invoked by through the "Consumer" class which retrieves the produced number and returns it to the output. Thus the Consumer can't retrieve the number without producing of it. 

Download this Program

Another program demonstrates the uses of wait() & notify() methods:

public class DemoWait extends Thread{
  int val=20;
  public static void main(String args[])  {
  DemoWait d=new DemoWait();
  d.start();
  new Demo1(d);
  }
  public void run(){
  try  {
  synchronized(this){
  wait();
  System.out.println("value is  :"+val);  
  }
  }catch(Exception e){}
 
}

  public void valchange(int val){  
  this.val=val;  
  try  {
  synchronized(this)  {
  notifyAll(); 
  }
  }catch(Exception e){}

  }
}
class Demo1 extends Thread{
  DemoWait d;
  Demo1(DemoWait d)  {
  this.d=d;
  start();
  }
  public void run(){
 try{
  System.out.println("Demo1 value is"+d.val);
  d.valchange(40);
  }catch(Exception e){}
  }
}

Output of the program is:

C:\j2se6\thread>javac DemoWait.java

C:\j2se6\thread>java DemoWait
Demo1 value is20
value is :40

C:\j2se6\thread>

Download this example

Advertisement

If you enjoyed this post then why not add us on Google+? Add us to your Circles



Liked it!  Share this Tutorial


Follow us on Twitter, or add us on Facebook or Google Plus to keep you updated with the recent trends of Java and other open source platforms.

Posted on: May 24, 2009

Related Tutorials

Discuss: Inter-Thread Communication   View All Comments

Post your Comment


Your Name (*) :
Your Email :
Subject (*):
Your Comment (*):
  Reload Image
 
 
Comments:5
Rahul singh sanger
February 14, 2013
In above first example an error is there

synchronized void put(int num) { value=false; // wrong value=true; // right } Here value should change in true not in false.. This is not my doubt is a correction i don't have any other space that why i put it in this section..
torres
November 30, 2011
Program

our sir told the same program in the class.... cheater
inspector J
March 29, 2012
urgent

listen in the shared class the method get() have a loop that repeating if "value" is false and leave loop if true encounters , but at the same time in starting we set "value" is false.Then how the hell "value" suppose to change,it shud not be changed and should not be leaving loop. Utter confusion here plz help plz... Thanks in adv. plz take interest..
Seshadri Rangaswami
December 17, 2012
Incorrect use of wait(0 method

The above program shows wait() method invoked with an "if" statement first and with no condiion next. wait method should always be invoked in a while loop. Otherwise the thread will encounter "liveness" problem.
ScriptKiddi
November 29, 2012
Doesn't work

First example doesnt really work - you have to change "value==false" into "value==true" in the put-function (line 35). Thanks for the fish. :)
DMCA.com