在工作中,我们往往会碰到需要两个不同模块分别生产和处理数据的场景,这时候我们就会用到生产消费模型。
一、概念
生产消费模型一般由三部分构成:生产者,容器,消费者。
生产者负责生产相关数据,并把生产的数据存储到容器中,而消费者则从容器中取出数据进行相关处理。
二、实现
下面我们来用Java代码对生产消费模型进行实现:
首先是容器设计,我们用数字链表数据量的增减模拟数据生产和消耗的过程,并且在仓库中写一个Lock锁作为保证线程安全锁。
java
public class Ware {
ArrayList<Integer> ar=new ArrayList<>();
Lock lock = new ReentrantLock();
int max = 10;
int start = 0;
int size(){
return ar.size();
}
void add(int num){
ar.add(num);
start++;
}
void remove(){
ar.remove(start-1);
start--;
}
}
然后是生产者和消费者,用容器中的锁保证线程安全的情况下实现。
java
import java.util.concurrent.locks.Lock;
public class Producer implements Runnable{
Ware ware;
Lock lock;
Producer(Ware ware,Lock lock){
this.ware = ware;
this.lock = lock;
}
@Override
public void run() {
while(true) {
lock.lock();
if (ware.size() >= ware.max) {
System.out.println("队列阻塞,无法继续添加......");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
lock.unlock();
}else {
ware.add(ware.start);
System.out.println("生产者线程启动,添加数据:"+ware.start);
lock.unlock();
}
}
}
}
java
import java.util.concurrent.locks.Lock;
public class Customer implements Runnable {
Ware ware;
Lock lock;
Customer(Ware ware, Lock lock) {
this.ware = ware;
this.lock = lock;
}
@Override
public void run() {
while(true) {
lock.lock();
if(ware.size()==0){
System.out.println("队列为空,无法继续消费......");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
lock.unlock();
}else {
System.out.println("消费者线程启动,消费数据:"+ware.start);
ware.remove();
lock.unlock();
}
}
}
}