Thread Procon
# Java Example - Producer/Consumer Problem
[ Java Examples](#)
The Producer/Consumer problem is a classic problem in the threading model: producers and consumers share the same storage space within the same time period. As shown in the figure below, producers store data into the space, while consumers take data from it. Without coordination, the following situation may occur:
The storage space is full, but the producer is occupying it. The consumer waits for the producer to release the space to remove the product, while the producer waits for the consumer to consume the product to add products to the space. They wait for each other, leading to a deadlock.

The following example demonstrates how to solve the Producer/Consumer problem using threads:
## Example
/*
author by .com
ProducerConsumerTest.java
*/
public class ProducerConsumerTest {
public static void main(String[] args){
CubbyHole c =new CubbyHole();
Producer p1 =new Producer(c, 1);
Consumer c1 =new Consumer(c, 1);
p1.start();
c1.start();
}
}
class CubbyHole {
private int contents;
private boolean available =false;
public synchronized int get(){
while(available ==false){
try{
wait();
}
catch(InterruptedException e){
}
}
available =false;
notifyAll();
return contents;
}
public synchronized void put(int value){
while(available ==true){
try{
wait();
}
catch(InterruptedException e){
}
}
contents = value;
available =true;
notifyAll();
}
}
class Consumer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number){
cubbyhole = c;
this.number= number;
}
public void run(){
int value =0;
for(int i =0; i <10; i++){
value = cubbyhole.get();
System.out.println("Consumer #"+this.number+" got: "+ value);
}
}
}
class Producer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number){
cubbyhole = c;
this.number= number;
}
public void run(){
for(int i =0; i <10; i++){
cubbyhole.put(i);
System.out.println("Producer #"+this.number+" put: "+ i);
try{
sleep((int)(Math.random()*100));
}catch(InterruptedException e){}
}
}
}
The output of the above code is:
Consumer #1 got: 0Producer #1 put: 0Producer #1 put: 1Consumer #1 got: 1Producer #1 put: 2Consumer #1 got: 2Producer #1 put: 3Consumer #1 got: 3Producer #1 put: 4Consumer #1 got: 4Producer #1 put: 5Consumer #1 got: 5Producer #1 put: 6Consumer #1 got: 6Producer #1 put: 7Consumer #1 got: 7Producer #1 put: 8Consumer #1 got: 8Producer #1 put: 9Consumer #1 got: 9
[ Java Examples](#)
YouTip