import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class Demo{
private static final int QUEUE_SIZE = 5;
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<Integer>();
Producer p1 = new Producer(queue, "生产者--1");
Producer p2 = new Producer(queue, "生产者--2");
Consumer c1 = new Consumer(queue, "消费者··1");
Consumer c2 = new Consumer(queue, "消费者··2");
Consumer c3 = new Consumer(queue, "消费者··3");
p1.start();
p2.start();
c1.start();
c2.start();
c3.start();
}
/**
* 生产者
*/
public static class Producer extends Thread {
private final Queue<Integer> queue;
private String name;
private int i = 0;
Producer(Queue<Integer> queue, String name) {
this.queue = queue;
this.name = name;
}
@Override
public void run() {
while (true) {
synchronized (queue) {
while (queue.size() == QUEUE_SIZE) {
try {
System.out.println("Queue is full, Producer[" + name + "] thread waiting for " + "consumer to take something from queue.");
queue.wait();
} catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println("[" + name + "] Producing value : " + i);
queue.offer(i++);
queue.notifyAll();
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 消费者
*/
public static class Consumer extends Thread {
private final Queue<Integer> queue;
private String name;
Consumer(Queue<Integer> queue, String name) {
this.queue = queue;
this.name = name;
}
@Override
public void run() {
while (true) {
synchronized (queue) {
while (queue.isEmpty()) {
try {
System.out.println("Queue is empty, Consumer[" + name + "] thread is waiting for Producer");
queue.wait();
} catch (Exception ex) {
ex.printStackTrace();
}
}
int x = queue.poll();
System.out.println("[" + name + "] Consuming value : " + x);
queue.notifyAll();
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}