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(); } }