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瓶奶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

window中搭建jenkins_Jenkins自动化部署(Windows服务器)

Jenkins自动化部署(Windows服务器)背景&#xff1a;一直部署SSM项目&#xff0c;每次都是 在tomcat的webapps目录下&#xff0c;将项目压缩成zip格式压缩包&#xff0c;拷贝的windows服务器的tomcat的webapps目录下&#xff0c;解压缩&#xff0c;覆盖&#xff0c;启动tomcat。…

C++ 堆、栈、自由存储区、全局静态存储区和常量存储区

文章来自一个论坛里的回帖&#xff0c;哪个论坛记不得了&#xff01; 在C中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量存…

内存spd规范_C语言内存泄露很严重,如何应对?

原文&#xff1a;https://blog.csdn.net/devcloud/article/details/1083359121.前言 最近部门不同产品接连出现内存泄漏导致的网上问题&#xff0c;具体表现为单板在现网运行数月以后&#xff0c;因为内存耗尽而导致单板复位现象。一方面&#xff0c;内存泄漏问题属于低级错误&…

接口测试的持续集成的工具(git代码管理工具,jenkins持续集成)

持续集成的概念&#xff1a;大白话就是持续的做一件事情&#xff0c;使其使用起来更加流畅&#xff1b;结合测试来讲就是说用工具管理好代码的同时&#xff0c;使代码运行的更加自动以及智能&#xff1b;提升测试效率。 ⽹址&#xff1a;https://git-scm.com/downloads 长这个…

Java学习笔记—UDP通信

一、UDP通信原理 UDP协议(用户数据报协议 User Datagram Protocol)是一种无连接通信协议&#xff0c; 即在数据传输时数据发送端和接收端不建立逻辑链接。因此UDP协议是一种 不可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象&#xff0c;但是这两个 Socket只是…

qt调用import sys库_Python模块之 sys 模块

引入1.什么是 sys 模块sys 模块是与 Python 解释器交互的一个接口该模块提供对解释器使用或维护的一些变量的访问和获取它提供了许多函数和变量来处理 Python 运行时环境的不同部分一.常见用法介绍1.sys.argv实现从程序的外部向程序传递参数返回的是一个列表, 第一个元素是程序…

A20 lvds

LVDS0: 数据线 LVDS0-VP0 LVDS0-VN0 LVDS0-VP1 LVDS0-VN1 LVDS0-VP2 LVDS0-VN2 时钟线 LVDS0-VPC LVDS0-VNC 电源线 插座的1,2,3接电源&#xff0c;最终连到 LCD-PWR 背光 另外背光单独在另一个插座上&#xff0c;LVDS0和LVDS1是一致的。 4…

顺丰快递单号的规律_顺丰快递顺丰快递查询单号查询

查询快递前&#xff1a;请先点击上面蓝字” 顺风快递快件单号查询“关注&#xff0c;关注后即可免费查询快递&#xff01;顺丰快递 顺丰快递查询 顺丰快递单号查询记下货物的订单号码。打开顺丰快递的官方网站。快件追踪中写入要查询的订单号码。输入订单号、验证码…

Java学习笔记—TCP通信

一、TCP通信原理 TCP(Transmission Control Protocol)协议是面向链接的通信协议&#xff0c;即数据传输之前&#xff0c;先在发送端和接收端建立逻辑链接&#xff0c;然后再传输数据&#xff0c;它提供了两台计算机之间可靠无差错的数据传输。TCP通信中必须明确客户端和服务器端…

Python 网页编程- Pyramid 安装测试

http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/install.html 是我在csdn的博客&#xff1a;http://blog.csdn.net/spaceship20008/article/details/8767884 放在cnblogs做备份 按照介绍操作。 我用的是mint13, python 3.2.3版本。 使用的是virtualenv 开…

qt能使用logback_X04Logback的配置

现如今&#xff0c;基于Java的网站开发明显过于复杂&#xff0c;远超实际工作需要。在Java领域中&#xff0c;大部分的网站开发框架也没有严格的遵循“可重用”原则。动态框架如Rails&#xff0c;Django和TurboGears等的出现&#xff0c;为Java网站开发提供了新思路&#xff0c…

A20 配置

TN92屏的显示配置&#xff1a; screen0_output_type1; screen0_output_mode5; lcd_x800; lcd_y480; lcd_swap0; lcd_dclk_freq33; lcd_hbp46; lcd_ht1055; lcd_vbp23; lcd_vt1050; lcd_lvds_ch1; lcd_lvds_mode0; lcd_lvds_bitwidth0; lcd_lvds_io_cross0; lcd_if0; N101BCG-L…

excel 2007 vba与宏完全剖析_Excel怎么保护自己的劳动成果?强制用户启用宏,再加上这一步...

知识改变命运&#xff0c;科技成就未来。当Excel工作簿中含有VBA代码时&#xff0c;用户在使用时需要启用宏&#xff0c;否则工作簿的某些功能就会失效。或者是编辑的VBA代码含有定期删除指令&#xff0c;为了保证工作簿的安全性&#xff0c;和防止他人禁用宏造成知识产权法受到…

Java学习笔记—Lambda表达式

1、Lambda表达式 Lambda表达式是Java8的新特性。 组成Lambda表达式的三个要素&#xff1a;形式参数&#xff0c;箭头操作符&#xff0c;代码块 Lambda表达式的格式&#xff1a;(形式参数) -> {代码块} //如&#xff1a;(int a, int b) -> {return a b;}形式参数&…

旅途的意义- 献给二十五岁

献给25岁你看过了许多美景你看过了许多美女你迷失在都市里每一分钟的光阴你品尝过夜的都市你看过飘着雨雪的各地你渐渐明白了书本里那些曾经不屑的道理却也在青春的激情里多出了那份胆怯的心情你看到了老板坐在办公室飘窗前&#xff0c;悠然的抽着烟你看到了以前的同学娶妻生子…

Asterisk标准通道变量

在asterisk中&#xff0c;定义了许多变量&#xff0c;或是有些变量能够被其读取。下面给出了它们的列表。在每一个application的帮助文档中&#xff0c;你可以获得更多的信息。所有这些变量都是大写的。 被*标记的变量是内建函数&#xff0c;不能在拨号方案中被设置&#xff0…

angular4输入有效性_Angular 2 用户输入

Angular 2 用户输入用户点击链接、按下按钮或者输入文字时&#xff0c;这些用户的交互行为都会触发 DOM 事件。本章中&#xff0c;我们将学习如何使用 Angular 事件绑定语法来绑定这些事件。以下Gif图演示了该实例的操作&#xff1a;源代码可以在文章末尾下载。绑定到用户输入事…

用python画国旗的程序_用Python的Turtle模块绘制五星红旗

Turtle官方文档 turtle的基本操作 # 初始化屏幕 window turtle.Screen() # 新建turtle对象实例 import turtle aTurtle turtle.Turtle() # 海龟设置 aTurtle.hideturtle() # 隐藏箭头 aTurtle.speed(10) # 设置速度 # 前进后退&#xff0c;左转右转 aTurtle.fd(100) # 前进10…

Java学习笔记——函数式接口

一、函数式接口概述 函数式接口&#xff1a;有且仅有一个抽象方法的接口。 Java中的函数式编程体现就是Lambda表达式&#xff0c;所以函数式接口就是可以适用于 Lambda表达式使用的接口。只有确保接口中有且仅有一个抽象方法&#xff0c;Java中的 Lambda表达式才能顺利地进行推…

windows快捷键

F1 显示当前程序或者windows的帮助内容。 F2 当你选中一个文件的话&#xff0c;这意味着“重命名” F3 当你在桌面上的时候是打开“查找&#xff1a;所有文件” 对话框 F10或ALT 激活当前程序的菜单栏 windows键或CTRLESC 打开开始菜单 CTRLALTDELETE 在win9x中打开关闭程序对话…