首页 > 其他分享 >23.异步模式-生产者、消费者

23.异步模式-生产者、消费者

时间:2024-03-27 22:32:49浏览次数:22  
标签:异步 linkedList 23 生产者 Message value int message public

1.与保护性暂停GuardedObject不同,不需要产生结果与消费结果的线程一一对应。

2.消费队列可以用来平衡生产和消费的线程资源。

3.生产者负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据。

4.消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据。

5.jdk中各种阻塞队列,就是采用这种模式。

public class QueueDemo {

    public static void main(String[] args) {
        MessageQueue messageQueue = new MessageQueue(2);
        for (int i = 0; i < 3; i++) {
            int index = i;
            new Thread(() -> {
                Message msg = new Message(index, "msg"+index);
                messageQueue.put(msg);
            }, "生产者").start();
        }

        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Message message = messageQueue.take();
                System.out.println("取出的message="+message);
            }

        }, "消费者").start();



    }

}

class MessageQueue {

    //双向队列
    private LinkedList<Message> linkedList = new LinkedList<>();
    //容量
    private int capcity;

    public MessageQueue(int capcity) {
        this.capcity = capcity;
    }

    /**
     * 取消息
     * @return
     */
    public Message take() {
        synchronized (linkedList) {
            while (linkedList.isEmpty()) {
                try {
                    System.out.println("队列为空,消费者等待");
                    linkedList.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //返回头元素
            Message message = linkedList.removeFirst();
            System.out.println("取出一条消息:"+message);
            linkedList.notifyAll();
            return message;
        }
    }

    /**
     * 放入消息
     */
    public void put(Message message) {
        synchronized (linkedList) {
            while(linkedList.size() == capcity) {
                try {
                    System.out.println("队列已满,生产者等待");
                    linkedList.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //添加到链表尾部
            linkedList.addLast(message);
            System.out.println("放入一条消息:"+message);
            //唤醒取消息线程
            linkedList.notifyAll();
        }
    }
}


final class Message {

    private int id;
    private Object value;

    public Message(int id, Object value) {
        this.id = id;
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public Object getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", value=" + value +
                '}';
    }
}

标签:异步,linkedList,23,生产者,Message,value,int,message,public
From: https://blog.csdn.net/qq_36352889/article/details/137028817

相关文章

  • 【题解】P10235 [yLCPC2024] C. 舞萌基本练习
    P10235舞萌基本练习题解思路看到最大值最小首先考虑二分答案。由于答案满足单调性,可以二分不优美度的最大值,也就是逆序对数的最大值。我们在每次增加一个元素的时候都要求解当前区间的逆序对数,所以不能用归并排序求逆序对数,考虑树状数组解法。如果不会树状数组求逆序对,请出......
  • 20231325贾罗祁 2023-2024-2《Python程序设计》实验二报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验二报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年3月27日必修/选修:公选课1.实验内容设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善;考核基本语法、判定......
  • Apache OFBiz 身份验证绕过漏洞 (CVE-2023-51467)
    ApacheOFBizAuthenticationBypassVulnerability(CVE-2023-51467)ApacheOFBizAuthenticationBypassVulnerability(CVE-2023-51467)PublishedbyDikshaOjhaonDecember27,2023SonicWall威胁研究团队在基于Java的Web框架ApacheOFBiz中发现了身份验证绕......
  • 基于java+springboot+vue实现的超市货品信息管理系统(文末源码+Lw+ppt)23-355
    摘 要随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的超市货品信息管理系统。当前的信息管理存在工作效率低,工作繁杂等问题,基于信息化的超市货品......
  • 基于java+springboot+vue实现的校园二手交易系统(文末源码+Lw+ppt)23-336
    摘 要自从新冠疫情爆发以来,各个线下实体越来越难做,线下购物的人也越来越少,随之带来的是一些不必要的浪费,尤其是即将毕业的大学生,各种用品不方便携带走导致被遗弃,造成大量的浪费。本系统目的就是让毕业生的二手物品有一定的价值,并且在疫情环境下做到零接触买卖,更加安全。在......
  • 基于java+springboot+vue实现的超市管理系统(文末源码+Lw+ppt)23-354
    摘 要系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对超市管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想,在超市管理系统实现了员工信息、......
  • 基于java+springboot+vue实现的校园二手交易系统(文末源码+Lw+ppt)23-336
     摘 要自从新冠疫情爆发以来,各个线下实体越来越难做,线下购物的人也越来越少,随之带来的是一些不必要的浪费,尤其是即将毕业的大学生,各种用品不方便携带走导致被遗弃,造成大量的浪费。本系统目的就是让毕业生的二手物品有一定的价值,并且在疫情环境下做到零接触买卖,更加安全。......
  • 基于java+springboot+vue实现的超市货品信息管理系统(文末源码+Lw+ppt)23-355
    摘 要随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的超市货品信息管理系统。当前的信息管理存在工作效率低,工作繁杂等问题,基于信息化的超市货品......
  • 基于java+springboot+vue实现的校园二手交易系统(文末源码+Lw+ppt)23-336
     摘 要自从新冠疫情爆发以来,各个线下实体越来越难做,线下购物的人也越来越少,随之带来的是一些不必要的浪费,尤其是即将毕业的大学生,各种用品不方便携带走导致被遗弃,造成大量的浪费。本系统目的就是让毕业生的二手物品有一定的价值,并且在疫情环境下做到零接触买卖,更加安全。......
  • 基于java+springboot+vue实现的超市货品信息管理系统(文末源码+Lw+ppt)23-355
    摘 要随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的超市货品信息管理系统。当前的信息管理存在工作效率低,工作繁杂等问题,基于信息化的超市货品......