Java中的生产消费模型解析

在工作中,我们往往会碰到需要两个不同模块分别生产和处理数据的场景,这时候我们就会用到生产消费模型。

一、概念

生产消费模型一般由三部分构成:生产者,容器,消费者。

生产者负责生产相关数据,并把生产的数据存储到容器中,而消费者则从容器中取出数据进行相关处理。

二、实现

下面我们来用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();
            }
        }
    }
}
相关推荐
whxnchy1 分钟前
C++刷题 - 7.27
开发语言·c++
白日梦想家-K42 分钟前
题单【模拟与高精度】
开发语言·c++·算法
超级晒盐人1 小时前
用落霞归雁的思维框架推导少林寺用什么数据库?
java·python·系统架构·学习方法·教育电商
岁忧1 小时前
(LeetCode 面试经典 150 题) 138. 随机链表的复制 (哈希表)
java·c++·leetcode·链表·面试·go
鹦鹉0071 小时前
IO流中的字节流
java·开发语言·后端
重生之我是Java开发战士1 小时前
【C语言】内存函数与数据在内存中的存储
c语言·开发语言·算法
haaaaaaarry1 小时前
Element Plus常见基础组件(二)
开发语言·前端·javascript
你我约定有三1 小时前
分布式微服务--Nacos作为配置中心(二)
java·分布式·spring cloud·微服务·架构·wpf·负载均衡
qq_165706071 小时前
java实现运行SQL脚本完成数据迁移
java·sql
AI_RSER1 小时前
第一篇:【Python-geemap教程(三)上】3D地形渲染与Landsat NDVI计算
开发语言·python·3d·信息可视化·遥感·gee