Java学习笔记—生产者和消费者模式
一、生产者和消费者问题
生产者消费者模式是一个十分经典的多线程协作的模式。
生产者和消费者问题包含了两类线程:一类是生产者线程用于生产数据,
一类是消费者数据用于消费数据。
/*生产者消费者案例 包含一个奶箱类,一个生产者类,一个消费者类和一个测试类。
*/
//定义奶箱类
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学习笔记—生产者和消费者模式相关推荐
- Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者
文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...
- Java多线模式-Producer-Consumer模式(生产者、消费者模式)
1.场景 有些时候需要两个或两个以上的线程协同工作,每个线程需要使用其他线程产生数据. 2.详细说明 可以把上面的场景抽象成生产者和消费者模式.从消费者的角度:消费者需要消费生产者生成的产品. 从生产 ...
- Java并发编程系列18:多线程之生产者和消费者模式_信号灯法(wait/notify通知机制)
1.生产者消费者模式 生产者消费者问题(Producer-consumer problem),也称为有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...
- Java基础进阶多线程-生产者和消费者模式
1.什么是"生产者和消费者模式"? 生产线程负责生产,消费线程负责消费 生产线程和消费线程要达到均衡 这是一种特殊的业务需求,在这种特殊的情况下需要使用wait方法和notify方 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- Java学习笔记22:并发(2)
Java学习笔记22:并发(2) 图源:PHP中文网 终止任务 终止线程有一种非常简单的方式:设置一个多线程共享的标记位,子线程用轮询的方式检查这个标记位,如果该标记位显示取消状态,就让子线程退出执行 ...
- 生产者与消费者模式的概念、运用、3种实现
生产者与消费者模式的概念.运用.3种实现 本文为笔者的学习整理总结,因此,若有任何不严谨或错误之处,还望不吝指教! 内容: 一. 概念 二. 运用 三. 实现1. Sychronized.wait.n ...
- Java学习笔记---多线程并发
Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...
最新文章
- rich-text 图片控制_武汉煤制工业级乙二醇图片
- java bat 运行 jar文件_运行bat文件启动java的jar且不弹出DOS窗口,后台运行java的jar包...
- CentOS 6安装详解及PXE 安装
- 构建用于测试的超大型内存InputStream
- python 容器类型存放_Python学习笔记三(容器)
- css中 Span 元素的 width 属性无效果原因及多种解决方案
- HDU2526 浪漫手机【模拟】
- python使用-Python的使用方法
- python元组排序_python元组怎么排序
- 学校计算机机房维护年度总结,学校计算机机房的管理和维护建议原稿(全文完整版)...
- 40岁计算机研究生能干什么工作,快四十岁了,还能干点什么?
- C语言-投票选举问题
- UDP进程terminated
- 自媒体会否是独立游戏的出路?
- 读者投稿:阿里 P6 面试体验
- easyExcel设置水印
- C3+H5小案例 | 03 3D立体旋转相册
- 浅谈马氏距离【Mahalonobis Distance】
- php获取当前日期所在自然周周一周末以及前后自然周始末
- 2023创业可以做什么项目,适合新手的六个创业项目推荐
热门文章
- jwt, json web token
- 昆仑量子计算机只是云计算模拟吧,量子模拟赛题让大学生认识未来计算发展方向...
- 【Git、GitHub、GitLab】九 工作中非常重要的一些git用法
- 《DSP using MATLAB》示例Example7.25
- Windows7睡眠后自动唤醒
- 【转载】linux进程及进程控制
- window.open使用中遇到的问题
- 关于Java中的HashMap
- [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]