直接看代码,有注释
import java.util.LinkedList;
import java.util.Queue;
/**
* Created by Administrator on 2019\5\8 0008.
*/
public class MyTest {
public static void main(String[] args){
// 创建共享队列
Queue<Integer> queue = new LinkedList<>();
// 每次生产商品的最大值
int maxSize = 5;
new Thread(new Producer(queue, maxSize)).start();
new Thread(new Consumer(queue, maxSize)).start();
}
}
class Producer implements Runnable{
private Queue<Integer> queue;
private int maxSize;
private int count = 1;
public Producer(Queue<Integer> queue, int maxSize){
this.queue = queue;
this.maxSize = maxSize;
}
@Override
public void run() {
// 死循环一直生产
while (true){
synchronized (queue){
// 当共享队列中的商品数量达到maxSize时,调用queue.wait()释放锁。
while (queue.size() == maxSize){
try{
System.out.println("队列中已经有"+maxSize+"个商品,停止生产---");
queue.wait();
}catch (InterruptedException ie){
ie.printStackTrace();
}
}
System.out.println("生产者正在生产第" + count+"个商品");
// 没有达到队列最大容量继续生产。
queue.add(count);
// 让线程睡眠只是为了在控制台方便观察结果
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
// 每生产一个商品,唤醒消费者进行消费
queue.notify();
}
}
}
}
class Consumer implements Runnable{
private Queue<Integer> queue;
private int maxSize;
public Consumer(Queue<Integer> queue, int maxSize){
this.queue = queue;
this.maxSize = maxSize;
}
@Override
public void run() {
// 死循环一直消费
while (true){
synchronized (queue){
// 当共享队列为空时,调用queue.wait(),释放锁,使得消费者线程等待
while (queue.isEmpty()){
System.out.println("队列中的商品已经全部消费---");
try{
queue.wait();
}catch (InterruptedException ie){
ie.printStackTrace();
}
}
// 当队列不为空时,取出商品进行消费
int v = queue.poll();
System.out.println("消费者在消费第 " + v+"个商品");
// 在消费完后,唤醒生产者继续进行生产
queue.notify();
}
}
}
}
输出结果:
生产者正在生产第1个商品
生产者正在生产第2个商品
生产者正在生产第3个商品
生产者正在生产第4个商品
生产者正在生产第5个商品
队列中已经有5个商品,停止生产---
消费者在消费第 1个商品
消费者在消费第 2个商品
消费者在消费第 3个商品
消费者在消费第 4个商品
消费者在消费第 5个商品
队列中的商品已经全部消费---
生产者正在生产第6个商品
生产者正在生产第7个商品
生产者正在生产第8个商品
生产者正在生产第9个商品
生产者正在生产第10个商品
队列中已经有5个商品,停止生产---
消费者在消费第 6个商品
消费者在消费第 7个商品
消费者在消费第 8个商品
消费者在消费第 9个商品
消费者在消费第 10个商品
队列中的商品已经全部消费---
生产者正在生产第11个商品
生产者正在生产第12个商品
参考文献:
https://blog.youkuaiyun.com/leel0330/article/details/80455307
633

被折叠的 条评论
为什么被折叠?



