消费者生产者模式,就是在一个系统中,存在消费者生产者两种角色,他们通过缓冲区进行通信,生产者生产消费者所需的资料,消费者把资料制作成产品或使用
下面讲用一个简单的例子模拟生产者消费者模式
创建一个仓库类
import java.util.LinkedList;
public class MyStorage {
LinkedList<Object> list = new LinkedList<>(); //定义集合,作为存储产品的容器
private static final int MAX_CAPACITY = 100;
//向仓库中存储产品
public synchronized void store(String product) {
//如果仓库已满,生产者等待
while (list.size() > MAX_CAPACITY) {
try {
this.wait(); //wait()/notify()这两个需要在同步代码块中,通过锁对象调用
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "++++++存储了:" + product);
list.offer(product); //把产品存储到后面
//通知消费者消费
this.notifyAll();
}
//从仓库中取产品
public synchronized void take() {
//判断仓库是否已空,当仓库为空时,需要等待
while (list.size() <= 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object product = list.poll(); //把前面的产品取出来
System.out.println(Thread.currentThread().getName() + "------消费了:" + product);
//通知生产者继续生产
this.notifyAll();
}
}
创建生产者线程类
import java.util.Random;
/*
*
* 生产者线程类
*
* */
public class ProducerThread extends Thread {
private MyStorage storage; //仓库
public ProducerThread(MyStorage storage) {
super();
this.storage = storage;
}
@Override
//每个月工作30天,每天存1次
public void run() {
for (int i = 1; i <= 30; i++) {
String product = "产品编号:" + new Random().nextInt(100);
storage.store(product);
}
}
}
创建消费者线程类
/*
*
* 消费者线程类
* */
public class ConsummerThread extends Thread{
private MyStorage storage;
public ConsummerThread(MyStorage storage) {
super();
this.storage = storage;
}
@Override
public void run() {
//从仓库中取产品
for (int i = 1; i <= 30; i++) {
storage.take();
}
}
}
这是一个消费者生产产品,生产者使用产品的例子,创建一个测试类分别创建三个生产者和三个消费者来测试这些代码
/*
*
* 测试生产者消费者
*
* */
public class Test {
public static void main(String[] args) {
//先创建仓库
MyStorage myStorage = new MyStorage();
//创建三个生产者线程模拟三个人
ProducerThread p1 = new ProducerThread(myStorage);
ProducerThread p2 = new ProducerThread(myStorage);
ProducerThread p3 = new ProducerThread(myStorage);
p1.setName("lisisi");
p2.setName("wangwu");
p3.setName("chengqi");
p1.start();
p2.start();
p3.start();
//创建三个消费者
ConsummerThread c1 = new ConsummerThread(myStorage);
ConsummerThread c2 = new ConsummerThread(myStorage);
ConsummerThread c3 = new ConsummerThread(myStorage);
c1.setName("吃货1号");
c2.setName("吃货2号");
c3.setName("吃货3号");
c1.start();
c2.start();
c3.start();
}
}
得到的结果如下