首页 > 编程语言 >java复习随笔(八)——线程(二)——生产者和消费者

java复习随笔(八)——线程(二)——生产者和消费者

时间:2022-09-05 12:56:17浏览次数:58  
标签:box java 复习 生产者 线程 牛奶 public 消费者

生产者消费者

生产者消费者模式概述

生产者消费者模式是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻
所谓生产者消费者问题,实际上主要是包含了两类线程:

  • 一类是生产者用于生产数据
  • 一类是消费者线程用于消费数据

为了解耦生产者和消费者的关系,通常会采用共享数据区域,就像是一个仓库

  • 生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为
  • 消费者只需要从共享数据区中去获取数据,并不需要关心生产者的行为
    image

为了体现生产和消费过程中的等待和唤醒,java就提供了几个方法供我们使用,这几个方法在Object类中Object类的等待和唤醒方法:

方法名 说明
void wait() 导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法
void notify() 唤醒正在等待对象监视器的单个线程
void notifyAll() 唤醒正在等待对象监视器的所有线程

生产者消费者案例

生产者消费者案例中包含的类:

  • 奶箱类(box):定义一个成员变量,表示第x瓶奶,提供存储牛奶和获取牛奶的操作
  • 生产者类(Producer):实现Runnable接口,重写run()方法,调用存储牛奶的操作
  • 消费者类(Customer):实现Runnable接口库,重写run()方法,调用牛奶的操作
  • 测试类(BoxDemo):里面有main方法,main方法中的代码步骤如下
    1. 创建奶箱对象
    2. 创建生产者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作
    3. 创建消费者对象,把奶箱对象作为构造方法参数传递,因为在这个类总要调用获取牛奶的操作
    4. 创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递
    5. 启动线程

代码如下:

  1. Box类
public class Box {
    private int milk;
    private boolean status; // 奶箱是否存在牛奶的状态

    public synchronized void put(int milk){
        if(status){
            try {
                wait(); // 若奶箱存在牛奶,则等待用户获取
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.milk = milk;
        System.out.println("送奶工将第"+this.milk+"瓶牛奶送入奶箱");
        status = true;
        notifyAll();
    }

    public synchronized void get() {
        if(!status){
            try {
                wait(); // 若奶箱不存在牛奶,则等送奶工送牛奶
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("用户取走第"+this.milk+"瓶牛奶");
        status = false;
        notifyAll();
    }
}
  1. Producer类
public class Producer implements  Runnable{

    private Box box;
    public Producer(Box box) {
        this.box = box;
    }

    @Override
    public void run() {
        for(int i = 1 ;i <= 5;i++){
            box.put(i);
        }
    }
}
  1. Customer类
public class Customer implements Runnable{
    private Box box;
    public Customer(Box box) {
        this.box = box;
    }

    @Override
    public void run() {
        while (true){
            box.get();
        }
    }
}
  1. BoxTest类
public class BoxTest {
    public static void main(String[] args){
        Box box = new Box();

        Producer p = new Producer(box);
        Customer c = new Customer(box);

        Thread t1 = new Thread(p);
        Thread t2 =new Thread(c);

        t1.start();
        t2.start();
    }
}

标签:box,java,复习,生产者,线程,牛奶,public,消费者
From: https://www.cnblogs.com/maplerain/p/16657595.html

相关文章

  • 一、Java入门
    一、java版本 1、过渡版本  2、长期支持版本LTS(Java8使用最广)二、java用于做什么(java的分类) 1、JavaSE用于桌面应用的开发(用户只要打开程序,程序的界面......
  • 力扣227(java)-基本计算器Ⅱ(中等)
    题目:给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在 [-231,231......
  • LeetCode 617 在 JavaScript 中合并两个二叉树
    LeetCode617在JavaScript中合并两个二叉树问题陈述给你两棵二叉树根1和根2.想象一下,当您将其中一个覆盖另一个时,两棵树的某些节点重叠,而其他节点则不重叠。您需......
  • Java接口自动化测试框架系列(八)测试结果通知(钉钉通知)
    通过前七步的框架搭建,此时框架已经可以开始进行接口测试了,但是运行的结果需要手动去项目的工作空间去查看,非常不方便。很多公司使用的钉钉来进行日常办公的沟通,我们也可以......
  • 多进程和多线程结合跑满cpu
    importjsonimportmultiprocessingimportthreadingimporttimeimportrandomimportrequestsimporturllib3lock=threading.RLock()urllib3.disable_warning......
  • import declarations are not supported by current JavaScript version
    Idea的js文件报错:ImportdeclarationsarenotsupportedbycurrentJavaScriptversion报这个错原因是,vue用的es6的语法,解决的话也很简单,只需要把idea的javaScript的版......
  • Dubbo 线程池占满可能原因分析
    可能原因:(1)dubbo中有httpClient调用。由于http工具默认仅支持5个并发,且有线程池队列,当请求量超过5个的时候,多余的请求会在队列中堆积。前一批http请求结束之后其他......
  • [javascript] 闭包问题
    闭包1.闭包的前置知识1.函数的执行上下文环境(Executioncontextoffunction)链接2.作用域(scope)在JavaScript中,对象和函数同样也是变量。在JavaScript中,......
  • [javascript]document的open() write() close()用法
    1、document.open()作用:打开一个新文档,即打开一个流,并擦除当前文档的内容。执行完后会打开一个空的html文档语法:document.open(mimetype,replace)参数:mimetype:可选。......
  • Idea 的Test测试报错:java.lang.IllegalStateException: Failed to load ApplicationC
    转载自:https://www.cnblogs.com/zhian/p/12600429.html因为在Test里面使用了注解@Autowired引入来至bean.xml文件的内容,而在Test没有没有办法自动引入,需要在Test类上加......