首页 > 其他分享 >生产者消费者模型

生产者消费者模型

时间:2024-08-20 11:57:20浏览次数:8  
标签:name 生产者 模型 age 线程 Student public 消费者

线程实现生产者和消费者模型,用到wait()等待和notify()唤醒机制, 

注意:等待唤醒机制是建立线程安全的基础之上设置的。

Student类:

public class Student {
    private String name;
    private int age;
    private boolean flag; // boolean类型的默认值在内存是false

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean getFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Product生产者类:

public class ProductThread extends Thread{
    private Student s;
    private int i = 0;

    public ProductThread(Student s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (s){
                //应该先看一看数据有没有被消费,若被消费了,才赋新的值,通知消费者消费,若没有消费,等待消费者消费
                if(s.getFlag()){
                    //若学生对象中flag成员变量值是true,生产就不会生产
                    //由多个线程共享且唯一的锁对象进行等待
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                if(i%2==0){
                    s.setName("光头强");
                    s.setAge(19);
                }else {
                    s.setName("熊大");
                    s.setAge(18);
                }
                i++;
                s.setFlag(true);
                //赋值之后应该通知消费者进行消费数据
                s.notify();
            }
        }

    }
}

Consumer消费者类:

public class ConsumerThread extends Thread {
    private Student s;

    public ConsumerThread(Student s) {
        this.s = s;
    }

    @Override
    public void run() {
//        Student s = new Student();
        while (true) {
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (s) {
                //消费者消费数据之前,先判断数据有没有生产,若生产了,就取值打印,若没有生产,就等待,通知生产者生产
                if (!s.getFlag()) {
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println(s.getName() + "-" + s.getAge());
                s.setFlag(false);
                //通知生产者赋值新的数据
                s.notify();
            }
        }
    }
}

测试类:

 等待唤醒机制:
        共享数据:学生对象(name,age)
        生产者线程:对学生对象进行赋值操作
        消费者线程:对学生对象进行取值操作


    为了观察更好的效果,我们可以让生产者赋值不同的信息
    这时候出现了重复取值和姓名与年龄对应不上的情况
    检测线程程序是否存在安全问题的三要素:
        1、是否存在多线程环境?是 生产者和消费者
        2、是否存在共享数据?是 student
        3、是否存在多条语句操作共享数据?是

    解决方案:
        1、加入同步代码块
        2、加入lock锁

    虽然解决了线程安全的问题,但是结果并不是我们想要的结果,在生产者消费者模型中,消费一次应该通知生产者生产。等待唤醒机制。
    注意:等待唤醒机制是建立线程安全的基础之上设置的。


 */
public class StudentDemo {
    public static void main(String[] args) {
        Student s = new Student();

        ProductThread p1 = new ProductThread(s);
        ConsumerThread c1 = new ConsumerThread(s);
        p1.start();
        c1.start();
    }
}

标签:name,生产者,模型,age,线程,Student,public,消费者
From: https://blog.csdn.net/ABU009/article/details/141350087

相关文章

  • 大模型算法必学,万字长文Llama-1到Llama-3详细拆解
    导读Llama系列的大语言模型在多个自然语言处理任务中表现出色,包括文本分类、情感分析和生成式问答,本质是使用Transformer架构并结合预训练和微调技术。本文详细讲解Llama-1到Llama-3,值得读者点赞收藏!引言在AI领域,大模型的发展正以前所未有的速度推进技术的边界。北京......
  • 【有源码】基于Python的股票数据分析与价格预测TensorFlow深度学习框架和长短期记忆网
    注意:该项目只展示部分功能,如需了解,文末咨询即可。本文目录1.开发环境2系统设计2.1设计背景2.2设计内容3系统页面展示3.1预测页面3.2可视化页面3.3管理页面3.4功能展示视频4更多推荐5部分功能代码5.1爬虫部分代码5.2预测部分代码1.开发环境开发语......
  • LLM大语言模型学习笔记(2)
    一、RAG定义        大型语言模型(LLM)相较于传统的语言模型具有更强大的能力,然而在某些情况下,它们仍可能无法提供准确的答案。为了解决大型语言模型在生成文本时面临的一系列挑战,提高模型的性能和输出质量,研究人员提出了一种新的模型架构:检索增强生成(RAG,Retrieval-Au......
  • 【书生大模型实战营(暑假场)闯关材料】基础岛:第3关 浦语提示词工程实践
    1.配置环境时遇到的问题注意要使用terminal,而不是jupyter。否则退出TMUX会话时,会出问题。退出TMUX会话命令如下:ctrl+BD#先按CTRL+B随后按D另外一个是,端口转发命令[email protected]{本地机器_PORT}:127.0.0.1:{开发机_PORT}-oS......
  • ollama搭建本地ai大模型并应用调用
    1、下载ollama1)https://ollama.com 进入网址,点击download下载2)下载后直接安装即可。2、启动配置模型默认是启动cmd窗口直接输入1ollamarunllama3启动llama3大模型 或者启动千问大模型1ollamarunqwen2启动输入你需要输入的问题即可 3、配置UI界面安装......
  • 面了美团大模型算法岗,问的贼细。。。
    最近这一两周看到不少互联网公司都已经开始秋招提前批面试了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC在变少,岗位要求还更高了。最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。《AIGC面试宝典......
  • Python 加载 TensorFlow 模型
    1.SavedModel和HDF5加载TensorFlow模型为了加载一个TensorFlow模型,我们首先需要明确模型的格式。TensorFlow支持多种模型格式,但最常见的两种是SavedModel和HDF5(对于Keras模型)。这里,我将分别给出加载这两种模型格式的示例代码。1.1加载SavedModel格式的TensorFlow模型SavedModel......
  • 生产者消费者问题-C++代码实现
    生产者消费者问题C++代码本文主要记录面试中手撕代码环节比较经常考察的生产者消费者问题,方便后续巩固和查看#include<iostream>#include<thread>#include<mutex>#include<condition_variable>#include<queue>#include<functional>usingnamespacestd;classProd......
  • 大模型agent开发之提示词选择器
    有时候单一的提示词模版无法满足复杂的任务需求,因此需要结合选择器使大模型有更加准确的判断,尤其是在高度上下文依赖性的对话或生成任务时,动态的选择最合适的示例或者提示词时尤其重要。本文同样使用langchain组件开发多用选择器方法。 长度智能选择器在langchain组件中Length......
  • tcp与udp的总结+connect阻塞+tcp三次握手、四次挥手+常见的服务器IO(发送数据+接收数
    一,TCP与UDP的基本总结TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP是面向连接的,提供可靠、顺序的传输,适用于需要高可靠性的应用,如网页浏览和文件传输。它通过重传机制和流量控制确保数据完整性。UDP是无连接的,速度快但不保证数据的可靠性和顺序,适用于对实时性......