[Consumer Producer Example] a java example for consumer producer problem
/**
*ConsumerProducerExample
*/
import java.util.Queue;
import java.util.Random;
import java.util.LinkedList;
public class ConsumerProducerExample {
/**
* Consumer
*/
public static class Consumer implements Runnable {
private Queue<Integer> sharedQ;
public Consumer (Queue<Integer> q) {
sharedQ = q;
}
public void consume() throws InterruptedException {
// keep running
while (true) {
synchronized(sharedQ) {
// while q is empty, wait();
while (sharedQ.isEmpty()) {
sharedQ.wait();
}
System.out.println(Thread.currentThread().toString() + ": consume " + sharedQ.poll());
// notify producer, if producer is wait.
sharedQ.notify();
}
}
}
@Override
public void run() {
System.out.println("consumer started");
try {
consume();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread() + ": " + e);
}
}
}
/**
* Producer
*/
public static class Producer implements Runnable {
private Queue<Integer> sharedQ;
private int qCapacity;
public Producer(Queue<Integer> q, int capacity) {
sharedQ = q;
qCapacity = capacity;
}
public void produce() throws InterruptedException {
// keep running
while (true) {
Random rand = new Random();
int v = rand.nextInt(10);
// sleep for a random period, then produce
Thread.sleep(v * 10);
synchronized (sharedQ) {
// if reach queue's capacity, wait consumer to consume.
while (sharedQ.size() == qCapacity) {
System.out.println(Thread.currentThread().toString() + ": queue is full");
sharedQ.wait();
}
sharedQ.offer(v);
System.out.println(Thread.currentThread().toString() + ": produce " + v);
// notify consumer that a new object has been produced.
sharedQ.notify();
}
}
}
@Override
public void run() {
System.out.println("producer started");
try {
produce();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread() + ": " + e);
}
}
}
public static void example() {
Queue<Integer> q = new LinkedList<Integer>();
Producer producer = new Producer(q, 2);
Consumer consumer = new Consumer(q);
Thread t1 = new Thread(producer);
t1.start();
Thread t2 = new Thread(consumer);
t2.start();
}
}