目录
1.设计过程
生产者消费者模式是实现线程通信的案例之一;
① 创建一个count库存变量; 再创建一个lock锁对象,对象值随意;
②创建两个内部类线程,都继承Thread类
一个是生产者子线程: 持续生产产品,库存量+1,到达一定库存量进入等待状态,释放锁,再进入消费者线程, 如此循环;
一个是消费者子线程: 持续消费产品,库存量-1,当库存量为0时,唤醒生产者线程,自身进入等待状态同时释放锁, 如此循环;
注意: 因为两个子线程开始运行时是并行执行,可能会出现一种极端情况---> 开始库存量为零,而消费者线程先抢到锁的情况。所以需要在锁代码里面添加判断语句,使自己进入等待状态。
2.代码演示
package com.bjsxt.test;
/*生产者消费者设计模式*/
public class Test9 {
public int count; //库存数量计数器
String lock = "锁"; //锁对象,名称随意
//生产者线程
public class Producer extends Thread{
@Override
public void run() {
synchronized (lock) {
while (true){
System.out.println("生产者生产了一个产品,当前库存量: " + (++count));
//每五百毫秒增加一个库存量,用于对结果可视化的优化
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//当产品数量为10时,唤醒其他调用wait()的锁,并且自己陷入WAITING等待状态并释放锁
if (count == 10) {
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
//消费者线程
public class Consumer extends Thread{
@Override
public void run() {
synchronized (lock) {
//避免出现库存量为0消费者依旧消费的极端情况
if (count == 0) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (lock) {
while (true){
System.out.println("消费者消费了一个产品,当前库存量: " + (--count));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//库存量不能小于0,库存量被消耗到0时,消费者线程进入WAITING状态
if (count == 0) {
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
}
public static void main(String[] args) {
Test9 test9 = new Test9();
//实例化生产者线程
Producer producer = test9.new Producer();
producer.start();//运行生产者线程
//实例化消费者线程
Consumer consumer = test9.new Consumer();
consumer.start();//运行消费者线程
}
}
结果:
生产者生产了一个产品,当前库存量: 1
生产者生产了一个产品,当前库存量: 2
生产者生产了一个产品,当前库存量: 3
生产者生产了一个产品,当前库存量: 4
生产者生产了一个产品,当前库存量: 5
生产者生产了一个产品,当前库存量: 6
生产者生产了一个产品,当前库存量: 7
生产者生产了一个产品,当前库存量: 8
生产者生产了一个产品,当前库存量: 9
生产者生产了一个产品,当前库存量: 10
消费者消费了一个产品,当前库存量: 9
消费者消费了一个产品,当前库存量: 8
消费者消费了一个产品,当前库存量: 7
消费者消费了一个产品,当前库存量: 6
消费者消费了一个产品,当前库存量: 5
消费者消费了一个产品,当前库存量: 4
消费者消费了一个产品,当前库存量: 3
消费者消费了一个产品,当前库存量: 2
消费者消费了一个产品,当前库存量: 1
消费者消费了一个产品,当前库存量: 0
生产者生产了一个产品,当前库存量: 1