场景设计:用OOP的思想设计一个生产者消费者的模型

2023-05-16

具体模型如下:

  • 有若干个消费者,每个消费者都可以独立的执行消费任务,偶尔会因为某种原因,该消费者会不可用,这个时候不能在给他分配消费任务了。
  • 此外还有大量待消费的生产品,每个消费者都可以一个耗时的IO操作。
  • 设计一个对象模型来满足这个场景。

说一些思路,这个问题首先可以使用阻塞队列来直接构建,因为本身就可以直接应用其生产者消费者模型来进行。然后就是一些搭建的思路!
这里将生产者创建一个类,然后再类内创建一个线程专门用来生产!

class Patient{
    BlockingQueue<Integer> queue;
    Thread thread;
    public Patient(BlockingQueue<Integer> queue){
        this.queue = queue;
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                produce();
            }
        });
    }

    public void produce(){
        int i=0;
        while (true){
            try {
                queue.put(i++);
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

然后是消费者这块,也创建一个类,同样类内创建一个线程用来消费产品。并且需要增加一个为了实现要求中“偶尔会因为某种原因,该消费者会不可用”的方法。以及恢复其功能的方法。这里我使用加锁的方式来实现。

class Nurse{
    ReentrantLock lock = new ReentrantLock();
    BlockingQueue<Integer> queue;
    Thread thread;
    String str;

    public Nurse(BlockingQueue<Integer> queue,String str){
        this.str = str;
        this.queue = queue;
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!queue.isEmpty()){
                    try {
                        lock.lock();
                        Integer integer = queue.take();
                        System.out.println(str+"正在处理"+integer);
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        lock.unlock();
                    }
                }
            }
        });
    }

    //停止护士的工作
    public void stop(){
        lock.lock();
        System.out.println(this.str+"停止工作");
    }

    public void reset(){
        lock.unlock();
        System.out.println(this.str+"重新工作");
    }
}

最终则在主函数中,只需要创建生产者和相应的消费者即可。

public class application_BlockingQueue {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(20);

        Patient patient = new Patient(queue);


        Nurse n1 = new Nurse(queue,"nurse1");
        Nurse n2 = new Nurse(queue,"nurse2");

        patient.thread.start();
        n1.thread.start();
        n2.thread.start();

        Thread.sleep(300);
        n1.stop();
        Thread.sleep(1500);
        n1.reset();

    }
}

最终效果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

场景设计:用OOP的思想设计一个生产者消费者的模型 的相关文章

随机推荐

  • Maven配置文件settings.xml详解

    一 配置分级 首先需要了解的是Maven配置文件以及配置方式的分级 xff0c 才能做到我们自己在日常开发配置中灵活使用 根据Maven官方资料 xff0c Maven将配置文件分为两级 xff1a 用户层级全局层级 Maven在运行的时候
  • 移动端视觉SLAM学习笔记 (五) 参数设置

    考虑到后续的各项参数 xff0c 这里先把配置文件和参数设置界面做好 xff0c 后面增加的参数就都可以添加进来了 Android本身参数设置的框架 xff0c 包括配置文件和设置界面 xff0c 也就是PreferenceFragment
  • Lambda — Stream API常用工具类

    最近发现代码里面大量处理集合的lambda表达式 xff0c 所以想着封装个常用工具类 xff0c 用来快速调用 xff0c 直接贴代码 只需传入集合 xff0c Function xff0c Predicate xff0c Compara
  • Java获取当前的UTC时间

    Java获取当前的UTC时间 Java获取当前的UTC时间Calendar与TimeZone结论 xff1a 因此想要获取UTC时间可以修改系统默认时区或转换时区修改系统默认时区SimpleDateFormat 转换时区 Instant J
  • springboot+security报错405方法不支持解决方法

    在使用 Spring Boot 和 Spring Security 进行 Web 开发的过程中 xff0c 有时候会遇到 HTTP 错误码为 405 的错误 HTTP 错误码 405 表示 方法不允许 xff0c 也就是客户端请求使用的 H
  • pip 安装faiss 不能用,使用conda安装并使用faiss成功

    pip 安装faiss 安装过程没有报错 xff0c import时候必报错 xff01 xff01 xff01 1 安装cpu版本faiss pip default time 61 1000 install i https pypi tu
  • busybox 网络相关

    busybox 瑞士军刀 包含很多linux unix 平台的有用utilities 比如sh ls cat grep touch chmod chown cp mv vi stat等等等 包括系统常用工具 编辑器 shell 文件操作 文
  • linux glibc2.12到2.14升级

    linux centos glibc 2 12 到 2 14 有些软件可能要求系统的 Glibc 高于某个版本才可以正常运行 如果您的 Glibc 低于要求的版本 xff0c 为了运行这些软件 xff0c 您就不得不升级您的 Glibc 了
  • Ubuntu 开机自定义脚本启动(最全版)

    一 背景 同伴在频繁更新系统环境 xff0c 需要经常使用reboot命令重启 xff0c 但每次重启后端Jar都会停止 xff0c 每次重启都需要手动启动Web后端Jar包 针对此种情况 xff0c 想到了采用开机自动启动Jar包的方法来
  • pycharm 中让python程序暂停的几种方法

    1 input 这种方法不用包含模块 xff0c 因此这也是最常用的一种暂停手段 Python2中的raw input 和input 语句在Python3中已经被合并到input 中 2 os system 34 pause 34 这种方法
  • 关于 Win32API 中的 LoadLibrary

    有人说 反射反射 xff0c 程序员的法宝 这句话一点也没有错 如果能够动态的加载类和方法 xff0c 就等于彻底的解除了类和类 xff0c 方法和方法的耦合 当然 xff0c 这样编译器就无法帮你检查出其中的错误了 xff0c 还是有一定
  • ViewPage+RadioGroup实现Tab切换

    以前写过一篇也是Tab切换的文章 xff0c 当时做安卓一年左右 xff0c 单纯觉得这样能实现功能 xff0c 但是没有注意到性能和代码简洁性的问题 xff0c 文章为 http blog csdn net nzzl54 article
  • 学科前沿技术(高性能计算机)

    高性能计算机 xff1a 二十世纪八 九十年代是高性能计算机丰富多彩的时期 xff0c 各种体系结构的系统争奇斗妍 进入二十一世纪 xff0c 高性能计算机产业逐渐成熟 xff0c 用户面大大扩大 xff0c 技术也不断聚焦 工业界认为 x
  • 异常行为分析模型设计

    本文针对异常访问现状及问题进行简要描述 xff0c 在此基础上提出基于一元线性回归的最小二乘法异常访问分析模型 xff0c 通过该模型解决了异常访问中时间与访问间相关性问题 异常访问是指网络行为偏离正常范围的访问情况 异常访问包含多种场景
  • CSS 参考手册

    CSS 参考手册 CSS 参考手册 CSS 选择器 W3School 的 CSS 参考手册定期通过所有主流浏览器进行测试 CSS 属性 CSS 属性组 xff1a 动画背景边框和轮廓盒 xff08 框 xff09 颜色内容分页媒体定位可伸缩
  • C语言求n的阶乘(n!)

    从键盘输入一个数 xff0c 求出这个数的阶乘 xff0c 即 n 算法思想 首先要清楚阶乘定义 xff0c 所谓 n 的阶乘 xff0c 就是从 1 开始乘以比前一个数大 1 的数 xff0c 一直乘到 n xff0c 用公式表示就是 x
  • Oracle grant all privileges to user

    测试流程 xff1a 解锁HR用户 SQL gt alter user hr account unlock identified by hr User altered 创建一个test用户 SYS 64 orcl11g gt CREATE
  • 《自己动手写Docker》书摘之一: Linux Namespace

    Linux Namespace 介绍 我们经常听到说Docker 是一个使用了Linux Namespace 和 Cgroups 的虚拟化工具 xff0c 但是什么是Linux Namespace 它在Docker内是怎么被使用的 xff0
  • YYText

    特性 API 兼容 UILabel 和 UITextView支持高性能的异步排版和渲染扩展了 CoreText 的属性以支持更多文字效果支持 UIImage UIView CALayer 作为图文混排元素支持添加自定义样式的 可点击的文本高
  • 场景设计:用OOP的思想设计一个生产者消费者的模型

    具体模型如下 xff1a 有若干个消费者 xff0c 每个消费者都可以独立的执行消费任务 xff0c 偶尔会因为某种原因 xff0c 该消费者会不可用 xff0c 这个时候不能在给他分配消费任务了 此外还有大量待消费的生产品 xff0c 每