生产者-消费者与队列的简单示例

深入浅出RabbitMQ:顺序消费、死信队列和延时队列 通过//关键参数,支持发送延迟消息// 声明交换机"delay.queue", // 交换机名字"fanout", // 交换机类型true, // 是否持久化false,false,false,props, // 设置属性。 阅读详情
/**
 *生产者-消费者与队列
 *制作吐司的例子,先向干吐司抹黄油,再在抹过黄油的吐司上涂果酱
 *本例子没有使用任何显式的同步,而是利用阻塞队列来实现同步
 *每片吐司在任何时刻都只由一个任务在操作
 * 
 * @author c
 * @data 2016-08-31
 * @modify
 * 
 */

class Toast {
    public enum Status {
        DRY, BUTTERED, JAMMED
    }

    private Status status = Status.DRY;
    private final int id;

    public Toast(int idn) {
        id = idn;
    }

    public void buffer() {
        status = Status.BUTTERED;
    }

    public void jam() {
        status = Status.JAMMED;
    }

    public Status getStatus() {
        return status;
    }

    public int getId() {
        return id;
    }

    public String toString() {
        return "Toast " + id + ": " + status;
    }
}

class ToastQueue extends LinkedBlockingQueue<Toast> {
}

class Toaster implements Runnable {
    private ToastQueue toastQueue;
    private int count = 0;
    private Random rand = new Random(47);

    public Toaster(ToastQueue tq) {
        toastQueue = tq;
    }

    public void run() {
        try {
            while (!Thread.interrupted()) {
                TimeUnit.MILLISECONDS.sleep(100 + rand.nextInt(500));
                // 制作吐司
                Toast t = new Toast(count++);
                print(t);
                // 插入队列
                toastQueue.put(t);

            }
        } catch (InterruptedException e) {
            print("Toaster interrupted");
        }
        print("Toaster off");
    }
}

// 给吐司抹黄油
class Butterer implements Runnable {
    private ToastQueue dryQueue, butteredQueue;

    public Butterer(ToastQueue dry, ToastQueue buttered) {
        dryQueue = dry;
        butteredQueue = buttered;
    }

    @Override
    public void run() {
        try {
            while (!Thread.interrupted()) {
                // 阻塞直到下一份可利用的吐司
                Toast t = dryQueue.take();
                t.buffer();
                print(t);
                butteredQueue.put(t);
            }
        } catch (InterruptedException e) {
            print("Butterer interrupted");
        }
        print("Butterer off");
    }
}

// 在抹过黄油的吐司上涂果酱
class Jammer implements Runnable {
    private ToastQueue butteredQueue, finishedQueue;

    public Jammer(ToastQueue buttered, ToastQueue finished) {
        butteredQueue = buttered;
        finishedQueue = finished;
    }

    @Override
    public void run() {
        try {
            while (!Thread.interrupted()) {
                // 阻塞直到下一份吐司可以利用
                Toast t = butteredQueue.take();
                t.jam();
                print(t);
                finishedQueue.put(t);
            }
        } catch (InterruptedException e) {
            print("Jammer interrupted");
        }
        print("Jammer off");
    }
}

// 消费吐司
class Eater implements Runnable {
    private ToastQueue finishedQueue;
    private int counter = 0;

    public Eater(ToastQueue finished) {
        finishedQueue = finished;
    }

    @Override
    public void run() {
        try {
            while (!Thread.interrupted()) {
                // 阻塞直到下一份吐司可以利用
                Toast t = finishedQueue.take();
                // 确认吐司按顺序到来和所有吐司都抹了果酱
                if (t.getId() != counter++ || t.getStatus() != Toast.Status.JAMMED) {
                    print(">>>> Error " + t);
                    System.exit(1);
                } else
                    print("chomp!" + t);
            }
        } catch (InterruptedException e) {
            print("Eater interrupted");
        }
        print("Eater off");
    }

}

public class ToastOMatic {

    public static void main(String[] args) throws Exception {
        ToastQueue dryQueue = new ToastQueue(), butteredQueue = new ToastQueue(), finishedQueue = new ToastQueue();
        ExecutorService exec = Executors.newCachedThreadPool();
        exec.execute(new Toaster(dryQueue));
        exec.execute(new Butterer(dryQueue, butteredQueue));
        exec.execute(new Jammer(butteredQueue, finishedQueue));
        exec.execute(new Eater(finishedQueue));
        TimeUnit.SECONDS.sleep(5);
        exec.shutdownNow();
    }

}
Qt QWaitConditon 实现生产者消费者 (源码) 用 QWaitConditon 实现生产者消费者,此为源代码。讲解文档见站内博客http://blog.youkuaiyun.com/qq_35488967/article/details/77923487 立即下载

相关推荐

A Super-Resolution Imaging Method for Forward-Looking Scanning Radar Based on Improved TV论文阅读

具体而言,作者提出了一种改进的总变差(Improved Total Variation, ITV)方法,通过引入。论文旨在解决前视扫描雷达(Forward-Looking Scanning Radar)超分辨率成像中传统。(Batch Processing),以增强图像边缘特征的保留能力,并提升计算效率。论文的核心创新点在于对传统TV正则化的邻域梯度计算进行扩展,提出。ITV剖面(图3d)在噪声下仍保持矩形边缘,仅存。​(公式10):实现稀疏约束。),抑制远端单元贡献。(幅度远低于目标)。

yangqoor的博客 1240

生产者-消费者 队列

总体而言,消费者队列适用于需要在多线程环境中实现生产者-消费者模式的场景,提供了更高级的功能和线程安全性,但引入了额外的复杂性。总而言之,消费者队列是一种特殊的队列,专门用于实现生产者-消费者模式,提供了额外的功能和操作来支持并发和线程间的数据传递。在中断处理程序中,由于中断的特殊性,往往是在单线程环境中进行处理的,因此可以避免引入复杂的同步机制,减少代码的复杂性和开销。功能和操作:消费者队列除了支持基本的入队和出队操作外,还提供了特定的功能,如阻塞等待和通知机制,以便生产者和消费者之间的同步和协调。

thing 1432

如何使用Ray和PyTorch训练模型

用户编写训练函数 → 定义单机训练逻辑。通过扩缩容配置 → 指定需要多少资源(Worker 数量、CPU/GPU)。训练器整合训练函数和配置 → 自动将训练函数分发到多个 Worker 上并行执行。Worker 运行训练函数 → 在分布式环境中完成模型训练。通过这种模式,Ray Train 实现了对分布式训练的抽象,用户只需关注单机训练逻辑,无需手动管理分布式通信和资源分配。

m0_62464865的博客 1922

消息队列(MQ)之生产者-消费者 | 一文搞定

大家好,我是狼王,一个爱打球的程序员随着互联网的发展,技术也在快速的迭代中,由于大流量,高并发的出现,很多问题也随之而来了,为了解决这些问题,一些高端的人才研究出了各种解决这些问题的东西,...

dabaoshiwode的博客 8678

超详细YOLOv8实例分割全程概述:环境、训练、验证与预测详解

这篇博客提供了一个全面的指南,介绍了如何使用 Ultralytics YOLOv8-seg 系列模型进行对象检测和分割任务。内容从环境搭建、模型选择、训练、验证到预测的完整流程都有详细说明。为想要使用 YOLOv8-seg 系列模型的开发者提供了一站式的解决方案。它不仅涵盖了从环境配置到模型部署的详细步骤,还解释了如何解读和使用模型输出,使得用户能够根据自己的需求选择合适的模型,并能够有效地训练和评估它们。

CDBmax的博客 6万+

sentaurus学习笔记(HFET_pGate_GaN仿真)(九)

`(sdedr:define-constant-profile-placement "Ohmic.s" "Ohmic" "Pl.ohmic.s" 0.002)`这一行将`"Ohmic"`掺杂剖面放置在`"Pl.ohmic.s"`参考评估窗口中,同样`0.002`可能表示掺杂剖面在窗口中的偏移量或其他参数。欧姆接触是半导体器件中的一种低阻抗电气接触,通常需要高掺杂来减少接触电阻并提高器件性能。通过这些步骤,SDE能够为器件的源极和漏极区域设置高掺杂的欧姆接触,这对于确保器件的高性能和低接触电阻至关重要。

qq_52640792的博客 1382

Linux——生产消费者模型(阻塞队列形式)

生产消费者模型是操作系统里非常经典模型,可应用于多线程并发协作,本质即通过一个容器(即缓冲区,本质是一种数据结构)来解决生产者与消费者的强耦合问题,也就是实现数据交互的低耦合。模型图示如下:在生产消费者模型中,生产者将产生的数据放入容器里,消费者从容器中获取数据来使用。而不是由生产者直接将数据“交给”消费者。相当于生产者把数据放入了一个“仓库”,消费者直接从“仓库”里拿,从而避免了生产者和消费者的直接接触。

weixin_61857742的博客 1872

碳化硅外延层厚度测量:红外干涉光谱与FFT技术详解

薄膜厚度测量是半导体制造中的关键工艺控制环节,其核心原理基于光的干涉现象。当光在薄膜上下界面反射并叠加时,会产生与厚度相关的干涉条纹。通过分析这些条纹,可以非接触、无损地获取薄膜的精确厚度信息。这项技术的核心价值在于实现了对关键工艺参数的在线、快速监控,对于提升器件性能与生产良率至关重要。在第三代半导体,尤其是碳化硅功率器件的制造中,外延层厚度直接决定了器件的击穿电压和导通电阻等核心性能。红外干涉光谱法因其对碳化硅材料在红外波段的良好透过性,成为该领域主流的厚度测量方案。通过快速傅里叶变换(FFT)对采集到

weixin_29032489的博客 308

深入理解生产者-消费者队列

生产者-消费者关系 生产者-消费者关系个人首先在操作系统中接触到,它是信号量(Semaphore,资源使用情况的抽象)机制的一种应用。 注意:信号量在 C 语言中是一个结构体型变量,其中 int 型 value 包含表示可用资源数,value = 0:无可用资源,value < 0:有|value|个进程等待此资源。还有 L 为等待此类资源的进程 PCB 表链。一类资源对应一种信号量。 生产者-消费者关系中包含一组生产者和一组消费者,两种角色并发地操作一个共享的缓冲池。生产者向缓冲池中放入数据,消

TOCreation 2821

51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南)

本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。

weixin_30752699的博客 414

[SC]SystemC在CPU/GPU验证中的应用(六)

本文提供了一个SystemC学习路线图,包含50个由浅入深的编程实例,涵盖从基础模块到复杂SoC建模的全过程。示例包括:基础模块(时钟、计数器)、通道(FIFO、握手)、TLM2.0接口、总线模型(AXI-Lite)、CPU/GPU内核实现、功耗分析、断言验证等。重点展示了SystemC在硬件验证中的关键应用:VCD波形生成、UVM-SystemC框架、Verilog DPI协同仿真、Python集成、NoC路由器和完整SoC建模(CPU+Cache+DRAM+互连)。每个示例提供完整代码和详细注释,建议分

元直的博客 1492

python 实现简单的生产者消费者模式

今日写了一个简单的生产者消费者脚本,仅仅是简单的代码;后续如果可以的话以多线程的方式,实现快速生产或者快速消耗等扩展操作。环境为python27,运行在Windows上。 `#-- encoding:utf-8 -- import threading,Queue import subprocess workqueue = Queue.Queue() def product(): for data in range(10): ip = “192.168.0.” + str(data) res = subpro

W_CCSSDDNN的博客 265

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3366

生产者消费者阻塞队列版

package com.example.demo.test; import ch.qos.logback.core.util.TimeUtil; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; public class Test1 { ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue&lt.

u010212399的博客 196

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【消息队列】ActiveMQ的简单实例 - 生产者消费者模式

安装首先,需要去官网下载windows版本(如果使用的是Linux,就下载对应Linux的)的ActiveMQ并安装,下载地址下载完后解压缩,进入bin目录,打开一个控制台,输入:activemq.bat start就可以启动ActiveMQ了。Github上项目地址:https://github.com/zgljl2012/activemq-learn实现在Eclipse中创建一个Maven项目(

zgljl2012的专栏 8106

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java多线程 - 生产者消费者模式

文章目录1. 生产者消费者模型2. 实现生产者消费者模型3. 生产者消费者模型的作用是什么? 问题: 1.什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型? 2. 生产者消费者模型的作用是什么? 1. 生产者消费者模型 在生产者-消费者模式中,通常有两类线程,即生产者线程(若干个)和消费者线程(若干个)。生产者线程向消息队列加入数据,消费者线程则从消息队列消耗数据。生产者和消费者、消息队列之间的关系结构图如图: (1) 消息队列可以用来平衡生产和消费的线程资源; (2) 生产者仅负责产生结果数据,

你今天真好看呀 580

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

生产者消费者模型

本文章简要介绍了生产者消费者模型的流程和实现

a1806542392的博客 674

简单的activemq,生产者和消费者代码

生产者: public class Sender { private static final int SEND_NUMBER=5; public static void main(String[] args) { //ConnectionFactory:连接工厂。JMS用它创建连接 ConnectionFactory connectionFac

wylfll的博客 2041

非阻塞队列实现生产消费者模式

非阻塞队列实现生产消费者模式

男儿当自强 836

生产者——消费者模式(一)

本文主要介绍生产者消费者模式的定义、使用场景及构成要素,并对单线程下的简单生产者消费者模式业务用python进行实现。

weixin_41767412的博客 346

使用阻塞队列实现生产者与消费者

使用阻塞队列实现生产者与消费者 对于生产者与消费者是多线程中非常重要的一种实现,生产者生产的产品放入队列中,消费者消费队列中的产品,如果队列中没有了产品,消费者不再消费,如果队列中的产品满了,生产者就不再生产,对于生产者与消费者的实现,本文提供了两种方法: 利用java提供的阻塞队列实现消费者与生产者 自己写一个实现消费者与生产者的队列类 1.利用java提供的阻塞队列实现消费者与生产者 package com.hangzhou.victor.testsynchronized; import

weixin_48709775的博客 535

python爬虫消费者与生产者_爬虫——生产者消费者

结构生产者生成网址并放入队列多个消费者从队列中取出网址1 from queue import queue2 import time, threading, requests34 url_base = 'http://www.qiushibaike.com/8hr/page/{}/'5 header = {}67 def load_data():8 return [url_base.form...

weixin_39979167的博客 122

【Java并发】生产者-消费者模式简单实现(模拟消息队列)

简单的模拟了一个消息队列 Producer:生产者 Consumer:消费者 Message:消息体 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class Test4 { public sta...

哈哈哈哈哈哈哈 4247

Ruby简单的生产者,消费者模式的实现

require 'thread' q = Queue.new producter = Thread.new { 10.times { |i| q.push i sleep 1 } q.push nil } consumer = Thread.new { loop { i = q.pop break if i == nil puts i

何旭东chucai的专栏 840

java多线程面试之手写阻塞队列,实现生产者和消费者模式。

什么是阻塞队列 首先,阻塞队列是一个队列,满足队列的基本数据结构,先进先出。其次,当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。 如何写一个阻塞队列 手写阻塞队列是多线程面试中常见的问题,能考察面试者对多线程和锁的基础知识。 通过synchronized关键字配合wait()和notify()方法,实现线程的交替运行: import java.util.Li

MaYuKang的博客 1738
上一篇: ## java实现的二叉树 ##
下一篇: 共享资源的简单示例
github_32658299
博客等级 码龄11年 21粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值