基于阻塞队列实现的简单生产者-消费者模式

简介: 基于阻塞队列实现的简单生产者-消费者模式

生产者生成数据放入到队列中,供消费者消费;


消费者从队列中获取数据,进行消费。


下面是一个简单的生产者-消费者模式代码实例:


生产者线程每隔3秒生产一个随机数并放入到阻塞队列中,消费者线程不断得去队列中获取元素进行消费。


1、生产者代码


/**
 * @Description: 生产者
 * @author: Alan
 * @Date: 2019/1/1 21:46
 */
public class Producer implements Runnable {
    private final BlockingQueue queue;
    public Producer(BlockingQueue q) {
        this.queue = q;
    }
    @Override
    public void run() {
        try {
            while (true) {
                //将生产的对象放入阻塞队列中,供消费者消费
                queue.put(produce());
                Thread.sleep(3000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 生产方法
     *
     * @return
     */
    public Object produce() {
        double num = Math.random();
        System.out.println(Thread.currentThread().getName() + "生产了随机数 " + num);
        return num;
    }
}


2、消费者代码


/**
 * @Description: 消费者
 * @author: Alan
 * @Date: 2019/1/1 21:46
 */
public class Consumer implements Runnable {
    private final BlockingQueue queue;
    public Consumer(BlockingQueue q) {
        this.queue = q;
    }
    @Override
    public void run() {
        try {
            while (true) {
                //从阻塞队列中取出元素并进行消费
                consume(queue.take());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 消费方法
     *
     * @param o
     */
    public void consume(Object o) {
        System.out.println(Thread.currentThread().getName() + "消费者消费了" + o.toString());
    }
}


3、main方法


/**
 * @Description: 使用BlockingQueue实现的简单生产者-消费者模式
 * @author: Alan
 * @Date: 2019/1/1 21:46
 */
public class Main {
    public static void main(String[] args) {
        //阻塞队列
        BlockingQueue queue = new LinkedBlockingQueue();
        //实例化生产者
        Producer producer = new Producer(queue);
        //实例化消费者1
        Consumer consumer1 = new Consumer(queue);
        //实例化消费者2
        Consumer consumer2 = new Consumer(queue);
        //启动生产者线程
        new Thread(producer).start();
        //启动消费者1线程
        new Thread(consumer1).start();
        //启动消费者2线程
        new Thread(consumer2).start();
    }
}


运行结果


Thread-0生产了随机数 0.4148294452924416
Thread-1消费者消费了0.4148294452924416
Thread-0生产了随机数 0.2548693317829043
Thread-2消费者消费了0.2548693317829043
Thread-0生产了随机数 0.7716023641452534
Thread-1消费者消费了0.7716023641452534
Thread-0生产了随机数 0.918439707362971
Thread-2消费者消费了0.918439707362971
Thread-0生产了随机数 0.8355631426120482
Thread-1消费者消费了0.8355631426120482
相关文章
|
存储 缓存 NoSQL
聊聊 Redis 的高级特性之一: 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 图中,消费者1和消费者2 订阅了 Redis 服务的频道 channel ,当生产者通过 PUBLISH 命令发送给频道 channel 时, 这个消息就会被发送给订阅它的两个客户端。
聊聊 Redis 的高级特性之一: 发布订阅
|
弹性计算 NoSQL 关系型数据库
又降价啦!2024年阿里云核心产品价格全线下调,最高幅度达55%
2024年3月1日开始,阿里云将开启新一轮的降价政策,核心产品价格全线下调,平均降幅20%,最高幅度达55%,阿里云希望通过此次大规模降价,让更多企业和开发者用上先进的公共云服务,加速云计算在中国各行各业的普及和发展。
又降价啦!2024年阿里云核心产品价格全线下调,最高幅度达55%
|
存储 Go 数据安全/隐私保护
Golang 语言怎么使用 Viper 管理配置信息?(下)
Golang 语言怎么使用 Viper 管理配置信息?(下)
242 0
|
Swift iOS开发
iOS @available 和 #available 的用法
iOS @available 和 #available 的用法
729 0
|
存储 Kubernetes Cloud Native
【云原生】k8s组件&架构介绍与K8s最新版部署
【云原生】k8s组件&架构介绍与K8s最新版部署
1093 0
|
人工智能 文字识别 测试技术
Florence-VL:微软和马里兰大学共同开源的多模态大语言模型
Florence-VL是由微软和马里兰大学共同开源的多模态大语言模型,结合生成式视觉基础模型Florence-2和深度-广度融合技术,实现视觉与语言理解的深度融合,适用于多种下游任务。
371 29
Florence-VL:微软和马里兰大学共同开源的多模态大语言模型
|
11月前
|
存储 测试技术 API
pytest接口自动化测试框架搭建
通过上述步骤,我们成功搭建了一个基于 `pytest`的接口自动化测试框架。这个框架具备良好的扩展性和可维护性,能够高效地管理和执行API测试。通过封装HTTP请求逻辑、使用 `conftest.py`定义共享资源和前置条件,并利用 `pytest.ini`进行配置管理,可以大幅提高测试的自动化程度和执行效率。希望本文能为您的测试工作提供实用的指导和帮助。
1122 15
|
存储 监控 关系型数据库
PostgreSQL的备份策略是什么?
【8月更文挑战第4天】PostgreSQL的备份策略是什么?
217 7
|
存储 负载均衡 安全
虚拟桌面和云桌面办公系统
虚拟桌面和云桌面办公系统