概述
生产者与消费者模型是一种经典的多线程协作模式,假设有两条线程,一条只负责执行生产,一条只负责消费,两者相互协作,在一定条件下交替执行。
代码
创建四个类,生产者、消费者、一个记录中间变量的库、测试类
生产者
public class Producer extends Thread{
@Override
public void run() {
//循环
while (true) {
//同步代码块
synchronized (Store.lock) {
//判断共享数据(核心逻辑)
//退出程序的判断
if (Store.count == 0) {
break;
}else {
//先判断是否有物件,如果有就等,没有就生产
//等待
if (Store.flag == 1) {
try {
Store.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//生产
System.out.println("生产者生产了一件货物");
//修改flag状态
Store.flag = 1;
//叫醒消费者
Store.lock.notifyAll();
}
}
}
}
}
}
消费者
public class Consumer extends Thread{
@Override
public void run() {
//循环
while (true) {
//同步代码块
synchronized (Store.lock) {
//判断共享数据(核心逻辑)
//退出程序的判断
if (Store.count == 0) {
System.out.println("消费者已经不行了。。。。");
break;
}else {
//先判断是否有物件,如果没有就等,有就消费
//等待
if (Store.flag == 0) {
try {
Store.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//消费
}else {
Store.count--;
System.out.println("消费者消耗了一件物件,还能消耗"+Store.count+"件");
//消费后唤醒生产者
Store.lock.notifyAll();
//修改flag状态
Store.flag = 0;
}
}
}
}
}
}
中间变量
//这个类控制生产者和消费者的执行
public class Store {
//该参数表示是否与生产物件 0:没有物件 1:有物件
public static int flag = 0;
//消费者消费的总个数
public static int count = 10;
//锁对象
public static Object lock =new Object();
}
测试类
public class Test1 {
public static void main(String[] args) {
//创建线程对象
Producer producer = new Producer();
Consumer consumer = new Consumer();
//设置名字
producer.setName("生产者");
consumer.setName("消费者");
//开启线程
producer.start();
consumer.start();
}
}
运行结果