一、生产者和消费者问题

生产者消费者模式是一个十分经典的多线程协作的模式。
生产者和消费者问题包含了两类线程:一类是生产者线程用于生产数据,
一类是消费者数据用于消费数据。
/*生产者消费者案例   包含一个奶箱类,一个生产者类,一个消费者类和一个测试类。
*/
//定义奶箱类
public class Box {//定义成员变量牛奶private int milk;//定义成员变量表示奶箱的状态private static boolean state = false;//存储牛奶的操作public synchronized void storeMilk(int milk) {//如果有牛奶,等待消费if (state) {//这里注意要进行异常处理try {wait();} catch (InterruptedException e) {//打印异常信息到控制台e.printStackTrace();}}//如果没有牛奶就生产牛奶this.milk = milk;System.out.println("生产者将第" + this.milk + "瓶奶放入奶箱中");//生产完毕,修改奶箱状态state = true;notify();}public synchronized void get() {//如果没有牛奶,等待生产if (!state) {//异常处理try{wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果有,就获取牛奶System.out.println("消费者拿到第" + this.milk + "瓶奶" );//消费完毕之后修改奶箱状态state = false;notify();}
}public class Producer implements Runnable {private Box b;//构造方法,将奶箱对象作为参数public Producer(Box b) {this.b = b;}@Overridepublic void run() {for (int i = 1; i <= 10; i++) {//调用存储牛奶的方法b.storeMilk(i);}}
}public class Customer implements Runnable {private Box b;//构造方法,将奶箱对象作为参数public Customer(Box b) {this.b = b;}@Overridepublic void run() {while(true) {//调用获取牛奶的方法b.get();}}
}
public static void main(String[] args) {//创建奶箱对象Box box = new Box();//创建生产者和消费者对象,并将奶箱对象作为构造方法参数传入Producer producer = new Producer(box);Customer customer = new Customer(box);//创建线程Thread t1 = new Thread(producer, "生产者");Thread t2 = new Thread(customer, "消费者");//启动线程t1.start();t2.start();}
运行结果如下:
生产者将第1瓶奶放入奶箱中
消费者拿到第1瓶奶
生产者将第2瓶奶放入奶箱中
消费者拿到第2瓶奶
生产者将第3瓶奶放入奶箱中
消费者拿到第3瓶奶
生产者将第4瓶奶放入奶箱中
消费者拿到第4瓶奶
生产者将第5瓶奶放入奶箱中
消费者拿到第5瓶奶
生产者将第6瓶奶放入奶箱中
消费者拿到第6瓶奶
生产者将第7瓶奶放入奶箱中
消费者拿到第7瓶奶
生产者将第8瓶奶放入奶箱中
消费者拿到第8瓶奶
生产者将第9瓶奶放入奶箱中
消费者拿到第9瓶奶
生产者将第10瓶奶放入奶箱中
消费者拿到第10瓶奶

Java学习笔记—生产者和消费者模式相关推荐

  1. Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者

    文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...

  2. Java多线模式-Producer-Consumer模式(生产者、消费者模式)

    1.场景 有些时候需要两个或两个以上的线程协同工作,每个线程需要使用其他线程产生数据. 2.详细说明 可以把上面的场景抽象成生产者和消费者模式.从消费者的角度:消费者需要消费生产者生成的产品. 从生产 ...

  3. Java并发编程系列18:多线程之生产者和消费者模式_信号灯法(wait/notify通知机制)

    1.生产者消费者模式 生产者消费者问题(Producer-consumer problem),也称为有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...

  4. Java基础进阶多线程-生产者和消费者模式

    1.什么是"生产者和消费者模式"? 生产线程负责生产,消费线程负责消费 生产线程和消费线程要达到均衡 这是一种特殊的业务需求,在这种特殊的情况下需要使用wait方法和notify方 ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  7. Java学习笔记22:并发(2)

    Java学习笔记22:并发(2) 图源:PHP中文网 终止任务 终止线程有一种非常简单的方式:设置一个多线程共享的标记位,子线程用轮询的方式检查这个标记位,如果该标记位显示取消状态,就让子线程退出执行 ...

  8. 生产者与消费者模式的概念、运用、3种实现

    生产者与消费者模式的概念.运用.3种实现 本文为笔者的学习整理总结,因此,若有任何不严谨或错误之处,还望不吝指教! 内容: 一. 概念 二. 运用 三. 实现1. Sychronized.wait.n ...

  9. Java学习笔记---多线程并发

    Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...

最新文章

  1. rich-text 图片控制_武汉煤制工业级乙二醇图片
  2. java bat 运行 jar文件_运行bat文件启动java的jar且不弹出DOS窗口,后台运行java的jar包...
  3. CentOS 6安装详解及PXE 安装
  4. 构建用于测试的超大型内存InputStream
  5. python 容器类型存放_Python学习笔记三(容器)
  6. css中 Span 元素的 width 属性无效果原因及多种解决方案
  7. HDU2526 浪漫手机【模拟】
  8. python使用-Python的使用方法
  9. python元组排序_python元组怎么排序
  10. 学校计算机机房维护年度总结,学校计算机机房的管理和维护建议原稿(全文完整版)...
  11. 40岁计算机研究生能干什么工作,快四十岁了,还能干点什么?
  12. C语言-投票选举问题
  13. UDP进程terminated
  14. 自媒体会否是独立游戏的出路?
  15. 读者投稿:阿里 P6 面试体验
  16. easyExcel设置水印
  17. C3+H5小案例 | 03 3D立体旋转相册
  18. 浅谈马氏距离【Mahalonobis Distance】
  19. php获取当前日期所在自然周周一周末以及前后自然周始末
  20. 2023创业可以做什么项目,适合新手的六个创业项目推荐

热门文章

  1. jwt, json web token
  2. 昆仑量子计算机只是云计算模拟吧,量子模拟赛题让大学生认识未来计算发展方向...
  3. 【Git、GitHub、GitLab】九 工作中非常重要的一些git用法
  4. 《DSP using MATLAB》示例Example7.25
  5. Windows7睡眠后自动唤醒
  6. 【转载】linux进程及进程控制
  7. window.open使用中遇到的问题
  8. 关于Java中的HashMap
  9. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]
  10. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]