Synchronization, Producer and Consumer Problem, wait(), notify() methods of the Thread
class Controller
{
private int counter;
public void set(int i)
{
counter=i;
}
public int get()
{
return counter;
}
}
class Producer extends Thread
{
private Controller obj;
public Producer(Controller c)
{
Obj=c;
}
public void run()
{
for(int i=0;I<5;i++ )
{
obj.set(i);
System.out.println("put:"+j);
}
}
}
class Consumer extends Thread
{
private Controller obj;
public Consumer(Controller c)
{
obj=c;
}
public void run()
{
for(int i=0;i<5;i++)
{
System.out.println("get:"+obj.get());
}
}
}
class TestSynchronization
{
public static void main(String args[])
{
Controller ctrl=new Controller;
Producer thread1=new producer(ctrl);
Consumer thread2=new Consumer(ctrl);
thread1.start();
thread2.start();
}
}
O/P:-
put:0
get:0
get:0
get:0
get:0
get:0
put:1
put:2
put:3
put:4
Explanation:
In above program the producer creates value faster or slower than consumer that means there is no synchronization & this problem is known as producer_consumer problem.
Solution Of Producer & Customer Problem:-
Synchronized:
The synchronized block or synchronized method, allow only one thread at a time to execute.
Wait():
This method will cause the current thread to go into wait state until & unless notify() or notifyAll() is not called.
notifyAll():
It will give signal to all the threads which are in state to continue.
class Controller
{
private int counter;
private Boolean available=false;
public synchronized int get()
{
while(available==false)
{
try
{
wait();
}
catch(Exception e)
{
}
}
notifyAll();
available=false;
return counter;
}
public synchronized int set(int value)
{
while(available==true)
{
try
{
wait();
}
catch(Exception e)
{
}
counter=value;
available=false;
notifyAll();
}
}
}
class Producer extends Thread
{
private Controller obj;
public Producer(Controller c)
{
Obj=c;
}
public void run()
{
for(int i=0;I<5;i++ )
{
obj.set(i);
System.out.println("put:"+j);
}
}
}
class Consumer extends Thread
{
private Controller obj;
public Consumer(Controller c)
{
obj=c;
}
public void run()
{
for(int i=0;i<5;i++)
{
System.out.println("get:"+obj.get());
}
}
}
class TestSynchronization
{
public static void main(String args[])
{
Controller ctrl=new Controller;
Producer thread1=new producer(ctrl);
Consumer thread2=new Consumer(ctrl);
thread1.start();
thread2.start();
}
}
O/P:
put:0
get:0
put:1
get:1
put:2
get:2
put:3
get:3
put:4
get:4