package gj.concurrent.customerproducer;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* Author: areful
*/
public class ProducerConsumerSample {
private static class Producer implements Runnable {
private final BlockingQueue<Object> queue;
private Producer(BlockingQueue<Object> q) {
queue = q;
}
public void run() {
try {
while (true) {
queue.put(produce());
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
private Object produce() {
return "producing a new object: " + new Object();
}
}
private static class Consumer implements Runnable {
private final BlockingQueue queue;
private Consumer(BlockingQueue q) {
queue = q;
}
public void run() {
try {
while (true) {
consume(queue.take());
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
private void consume(Object x) {
System.out.println("consuming object: " + x);
}
}
public static void main(String[] args) {
BlockingQueue<Object> q = new ArrayBlockingQueue<>(10);
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}