package com.interview.algorithms.design; import com.interview.basics.java.cocurrency.blocking.BlockingQueue; import com.interview.basics.java.cocurrency.blocking.BlockingQueueUsingLock; import java.util.Random; /** * Created with IntelliJ IDEA. * User: stefanie * Date: 10/24/14 * Time: 10:57 AM */ public class C10_5_ProducerConsumerWithBlockingQueue { static class Producer implements Runnable { int counter = 0; BlockingQueue<Message> queue; Random random = new Random(); int id; public Producer(int id, BlockingQueue<Message> queue) { this.id = id; this.queue = queue; } @Override public void run() { System.out.printf("PRODUCER-%d IS ON\n", this.id); while (true) { int time = random.nextInt(5) + 1; String message = "task " + id + "-" + counter++ + " need " + time + " seconds"; Message m = new Message(time, message); System.out.printf("PRODUCER-%d: generate a message %s\n ", this.id, m.message); try { queue.add(m); System.out.printf("PRODUCER-%d: pushed a message %s in queue, current size is %d\n ", this.id, m.message, queue.size()); Thread.currentThread().sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void start() { Thread thread = new Thread(this); thread.start(); } } static class Consumer implements Runnable { BlockingQueue<Message> queue; int id; public Consumer(int id, BlockingQueue<Message> queue) { this.id = id; this.queue = queue; } @Override public void run() { System.out.println("CONSUMER IS ON"); while (true) { try { Message m = queue.take(); System.out.printf("CONSUMER-%d: handling %s\n", this.id, m.message); Thread.currentThread().sleep(m.time * 3 * 1000); System.out.printf("CONSUMER-%d: finish %s\n", this.id, m.message); } catch (InterruptedException e) { e.printStackTrace(); } } } public void start() { Thread thread = new Thread(this); thread.start(); } } public static void main(String[] args) { BlockingQueue<Message> queue = new BlockingQueueUsingLock<>(5); for (int i = 0; i < 3; i++) { new Producer(i + 1, queue).start(); try { Thread.currentThread().sleep(3 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 5; i++) { new Consumer(i + 1, queue).start(); try { Thread.currentThread().sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }