那什么是生产者消费者模式?
在一个生产环境中,生产者负责向缓冲区内添加商品(添加数据),消费者负责从缓冲区取出数据。
最经典的现实案例就是KFC,厨师(生产者)向存储汉堡的货柜(缓冲区)中添加汉堡(添加数据),消费者去点餐,购买汉堡(取出数据)。这就是最简单的生产者消费者模式。
1.汉堡类,所需要基本数据对象
//设置数据对象的基本属性,这里使用最简单的id
public class Hamburger {
//设置商品的属性
private Integer id;
public Hamburger(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Hamburger{" +
"id=" + id +
'}';
}
}
2.制作装汉堡的容器,缓冲区存放生产者生产的数据对象
//创建容器
public class Container {
//定义一个数组来装汉堡
//当然这里也可以用集合框架ArrayList<Hamburger>来进行存储数据
public Hamburger[] array = new Hamburger[6];
public int index = 0;
//对每次操作添加锁,避免多个线程操作同一个资源
//也可以使用重入锁ReentrantLock
/*
*ReentrantLock使用方法:
1.创建ReentrantLock对象
private ReentrantLock reentrantLock = new ReentrantLock();
2.加锁:
reentrantLock.lock();
3.解锁:
reentrantLock.unlock();
*两个方法间就是锁住的内容,资源
*/
//向容器中添加汉堡
public synchronized void push(Hamburger hamburger){
if(index < array.length){
array[index] = hamburger;
index++;
System.out.println("生产了一个汉堡:" + hamburger);
}
}
//从容器中取出汉堡
public synchronized Hamburger pop(){
if(index>0){
index--;
System.out.println("消费了一个汉堡:" + array[index]);
return array[index];
}
return null;
}
}
3.创建生产者线程:
//生产者
public class Producer implements Runnable {
//创建容器对象
private Container container = null;
public Producer(Container container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 30; i++) {
//创建带编号的汉堡对象
Hamburger hamburger = new Hamburger(i);
//将汉堡装入容器中
this.container.push(hamburger);
try {
//线程休眠
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
4.创建消费者线程
public class Consumer implements Runnable {
//创建容器对象
private Container container = null;
public Consumer(Container container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 30; i++) {
//购买汉堡
this.container.pop();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
5.测试类
public class Test {
public static void main(String[] args) {
//创建生产者,消费者,容器对象
Container container = new Container();
Producer producer = new Producer(container);
Consumer consumer = new Consumer(container);
//开启生产者,消费者线程
new Thread(producer).start();
new Thread(producer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
}
}