package com.interview.algorithms.design;
import com.interview.basics.java.cocurrency.blocking.BlockingFixCapabilityQueue;
import java.util.Random;
/**
* Created_By: stefanie
* Date: 14-10-23
* Time: 下午7:10
*/
public class C10_5_ProducerConsumerWithBlockingFixCapacityQueue {
static class Producer implements Runnable {
int counter = 0;
BlockingFixCapabilityQueue<Message> queue;
Random random = new Random();
int id;
public Producer(int id, BlockingFixCapabilityQueue<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);
queue.push(m);
System.out.printf("PRODUCER-%d: pushed a message %s in queue, current size is %d\n ", this.id, m.message, queue.size());
try {
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 {
BlockingFixCapabilityQueue<Message> queue;
int id;
public Consumer(int id, BlockingFixCapabilityQueue<Message> queue) {
this.id = id;
this.queue = queue;
}
@Override
public void run() {
System.out.println("CONSUMER IS ON");
while (true) {
Message m = queue.pop();
System.out.printf("CONSUMER-%d: handling %s\n", this.id, m.message);
try {
Thread.currentThread().sleep(m.time * 3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("CONSUMER-%d: finish %s\n", this.id, m.message);
}
}
public void start(){
Thread thread = new Thread(this);
thread.start();
}
}
public static void main(String[] args) {
BlockingFixCapabilityQueue<Message> queue = new BlockingFixCapabilityQueue<>(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();
}
}
}
}