Java程序设计之消费者和生产者
新建一个Break类,表示食物数量。
public class Break {
public static final int MAX = 10; //最多一次性煮十个面包
Stack<Integer> stack = new Stack<Integer>();
public static int food_count = 0; //统计食物的个数
//做面包
public synchronized void make_food(int number){
stack.push(number);
food_count++;
}
//吃食物
public synchronized int eat_food(){
food_count--;
return stack.pop();
}
}
在创建一个厨房类,为了制作食物或者是消耗食物,若食物没有了,则消费者进入wait(),生产者开始制作食物,随后唤醒等待的消费者。
public class Kitchen {
private Break food ;
public static int people1_eatnumber = 0;//第一个人吃的面包数量
public static int people2_eatnumber = 0;//第二个人吃的面包数量
public static final int TOTOAL_NUM = 100;//总共做的面包数量
public static int icount = 1;//统计做过的面包数量
public Kitchen(Break food){
this.food = food;
}
//做面包的方法
public synchronized void make(){
if(food.food_count<10){//锅是不是满了
food.make_food(Kitchen.icount);
System.out.println("做完了第"+Kitchen.icount+"个食物。");
Kitchen.icount++;
notifyAll();//食物有了,找两个人来吃面包
}else{
System.out.println("锅已经装满,一次性装十个,等待两人吃食物。");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//进入阻塞状态,等待消费者唤醒
}
}
//吃面包的方法
public synchronized void eat(){
if(food.food_count>0){
int temp = food.eat_food();//吃掉面包的编号
System.out.println(Thread.currentThread().getName()+"吃掉了第"+temp+"个食物");
if(Thread.currentThread().getName().equals("一号")){
people1_eatnumber++;
}else{
people2_eatnumber++;
}
notifyAll(); //唤醒继续做面包
}else{
System.out.println("食物吃完了,等待重新烹饪。");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
下面进入消费者和生产者类的构造,传递给一个Kitchen对象,其中消费者调用Kitchen类中的吃方法。
public class consumer implements Runnable {
Kitchen kitchen;
public consumer(Kitchen kitchen){
this.kitchen = kitchen;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
if(kitchen.icount>100&&Break.food_count<=0){
break;
}
try{
kitchen.eat();
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
然而生产者则是调用了Kitchen对象中的制作方法。
public class product implements Runnable {
private Kitchen kitchen;
public product(Kitchen kitchen){
this.kitchen = kitchen;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
//结束这个线程
if(Kitchen.icount > 100){
break;
}
try{
kitchen.make();
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
System.out.println("厨房食物材料已经做完。");
}
}
下面开始写主类,包括了main方法,启动程序,创建一个test类,实现:
public class test {
public static void main(String[] args){
Break brake = new Break();
Kitchen kitchen = new Kitchen(brake);
product p = new product(kitchen);
consumer c1 = new consumer(kitchen);
consumer c2 = new consumer(kitchen);
Thread food = new Thread(p,"食物");
Thread people1 = new Thread(c1,"一号");
Thread people2 = new Thread(c2,"二号");
food.start();
people1.start();
people2.start();
try{
food.join();
people1.join();
people2.join();
}catch(Exception e){
e.printStackTrace();
}
System.out.println("一号吃了"+Kitchen.people1_eatnumber);
System.out.println("二号吃了"+Kitchen.people2_eatnumber);
}
}
输出结果如下:
做完了第1个食物。
二号吃掉了第1个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第2个食物。
一号吃掉了第2个食物
食物吃完了,等待重新烹饪。
做完了第3个食物。
一号吃掉了第3个食物
食物吃完了,等待重新烹饪。
做完了第4个食物。
一号吃掉了第4个食物
做完了第5个食物。
二号吃掉了第5个食物
食物吃完了,等待重新烹饪。
做完了第6个食物。
二号吃掉了第6个食物
食物吃完了,等待重新烹饪。
做完了第7个食物。
二号吃掉了第7个食物
做完了第8个食物。
一号吃掉了第8个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第9个食物。
一号吃掉了第9个食物
食物吃完了,等待重新烹饪。
做完了第10个食物。
一号吃掉了第10个食物
做完了第11个食物。
二号吃掉了第11个食物
食物吃完了,等待重新烹饪。
做完了第12个食物。
二号吃掉了第12个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第13个食物。
一号吃掉了第13个食物
做完了第14个食物。
二号吃掉了第14个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第15个食物。
一号吃掉了第15个食物
做完了第16个食物。
二号吃掉了第16个食物
食物吃完了,等待重新烹饪。
做完了第17个食物。
二号吃掉了第17个食物
食物吃完了,等待重新烹饪。
做完了第18个食物。
二号吃掉了第18个食物
食物吃完了,等待重新烹饪。
做完了第19个食物。
二号吃掉了第19个食物
食物吃完了,等待重新烹饪。
做完了第20个食物。
二号吃掉了第20个食物
食物吃完了,等待重新烹饪。
做完了第21个食物。
二号吃掉了第21个食物
食物吃完了,等待重新烹饪。
做完了第22个食物。
二号吃掉了第22个食物
食物吃完了,等待重新烹饪。
做完了第23个食物。
二号吃掉了第23个食物
食物吃完了,等待重新烹饪。
做完了第24个食物。
二号吃掉了第24个食物
食物吃完了,等待重新烹饪。
做完了第25个食物。
二号吃掉了第25个食物
食物吃完了,等待重新烹饪。
做完了第26个食物。
二号吃掉了第26个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第27个食物。
一号吃掉了第27个食物
食物吃完了,等待重新烹饪。
做完了第28个食物。
一号吃掉了第28个食物
食物吃完了,等待重新烹饪。
做完了第29个食物。
一号吃掉了第29个食物
做完了第30个食物。
二号吃掉了第30个食物
食物吃完了,等待重新烹饪。
做完了第31个食物。
二号吃掉了第31个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第32个食物。
一号吃掉了第32个食物
食物吃完了,等待重新烹饪。
做完了第33个食物。
一号吃掉了第33个食物
食物吃完了,等待重新烹饪。
做完了第34个食物。
一号吃掉了第34个食物
做完了第35个食物。
二号吃掉了第35个食物
食物吃完了,等待重新烹饪。
做完了第36个食物。
二号吃掉了第36个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第37个食物。
一号吃掉了第37个食物
食物吃完了,等待重新烹饪。
做完了第38个食物。
一号吃掉了第38个食物
食物吃完了,等待重新烹饪。
做完了第39个食物。
一号吃掉了第39个食物
做完了第40个食物。
二号吃掉了第40个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第41个食物。
一号吃掉了第41个食物
做完了第42个食物。
二号吃掉了第42个食物
做完了第43个食物。
二号吃掉了第43个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第44个食物。
一号吃掉了第44个食物
食物吃完了,等待重新烹饪。
做完了第45个食物。
一号吃掉了第45个食物
做完了第46个食物。
二号吃掉了第46个食物
食物吃完了,等待重新烹饪。
做完了第47个食物。
二号吃掉了第47个食物
食物吃完了,等待重新烹饪。
做完了第48个食物。
二号吃掉了第48个食物
食物吃完了,等待重新烹饪。
做完了第49个食物。
二号吃掉了第49个食物
食物吃完了,等待重新烹饪。
做完了第50个食物。
二号吃掉了第50个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第51个食物。
一号吃掉了第51个食物
食物吃完了,等待重新烹饪。
做完了第52个食物。
一号吃掉了第52个食物
做完了第53个食物。
二号吃掉了第53个食物
做完了第54个食物。
一号吃掉了第54个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第55个食物。
做完了第56个食物。
二号吃掉了第56个食物
一号吃掉了第55个食物
做完了第57个食物。
一号吃掉了第57个食物
食物吃完了,等待重新烹饪。
做完了第58个食物。
一号吃掉了第58个食物
做完了第59个食物。
二号吃掉了第59个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第60个食物。
一号吃掉了第60个食物
做完了第61个食物。
二号吃掉了第61个食物
食物吃完了,等待重新烹饪。
做完了第62个食物。
二号吃掉了第62个食物
食物吃完了,等待重新烹饪。
做完了第63个食物。
二号吃掉了第63个食物
食物吃完了,等待重新烹饪。
做完了第64个食物。
二号吃掉了第64个食物
食物吃完了,等待重新烹饪。
做完了第65个食物。
二号吃掉了第65个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第66个食物。
做完了第67个食物。
二号吃掉了第67个食物
一号吃掉了第66个食物
做完了第68个食物。
一号吃掉了第68个食物
食物吃完了,等待重新烹饪。
做完了第69个食物。
一号吃掉了第69个食物
食物吃完了,等待重新烹饪。
做完了第70个食物。
一号吃掉了第70个食物
做完了第71个食物。
二号吃掉了第71个食物
食物吃完了,等待重新烹饪。
做完了第72个食物。
二号吃掉了第72个食物
食物吃完了,等待重新烹饪。
做完了第73个食物。
二号吃掉了第73个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第74个食物。
一号吃掉了第74个食物
食物吃完了,等待重新烹饪。
做完了第75个食物。
一号吃掉了第75个食物
做完了第76个食物。
二号吃掉了第76个食物
食物吃完了,等待重新烹饪。
做完了第77个食物。
二号吃掉了第77个食物
食物吃完了,等待重新烹饪。
做完了第78个食物。
二号吃掉了第78个食物
食物吃完了,等待重新烹饪。
做完了第79个食物。
二号吃掉了第79个食物
食物吃完了,等待重新烹饪。
做完了第80个食物。
二号吃掉了第80个食物
食物吃完了,等待重新烹饪。
做完了第81个食物。
二号吃掉了第81个食物
食物吃完了,等待重新烹饪。
做完了第82个食物。
二号吃掉了第82个食物
食物吃完了,等待重新烹饪。
做完了第83个食物。
二号吃掉了第83个食物
食物吃完了,等待重新烹饪。
做完了第84个食物。
二号吃掉了第84个食物
食物吃完了,等待重新烹饪。
做完了第85个食物。
二号吃掉了第85个食物
食物吃完了,等待重新烹饪。
做完了第86个食物。
二号吃掉了第86个食物
食物吃完了,等待重新烹饪。
做完了第87个食物。
二号吃掉了第87个食物
食物吃完了,等待重新烹饪。
做完了第88个食物。
二号吃掉了第88个食物
做完了第89个食物。
二号吃掉了第89个食物
食物吃完了,等待重新烹饪。
做完了第90个食物。
二号吃掉了第90个食物
食物吃完了,等待重新烹饪。
做完了第91个食物。
二号吃掉了第91个食物
食物吃完了,等待重新烹饪。
做完了第92个食物。
二号吃掉了第92个食物
食物吃完了,等待重新烹饪。
做完了第93个食物。
二号吃掉了第93个食物
食物吃完了,等待重新烹饪。
做完了第94个食物。
二号吃掉了第94个食物
食物吃完了,等待重新烹饪。
做完了第95个食物。
二号吃掉了第95个食物
食物吃完了,等待重新烹饪。
做完了第96个食物。
二号吃掉了第96个食物
食物吃完了,等待重新烹饪。
做完了第97个食物。
二号吃掉了第97个食物
食物吃完了,等待重新烹饪。
做完了第98个食物。
二号吃掉了第98个食物
食物吃完了,等待重新烹饪。
做完了第99个食物。
二号吃掉了第99个食物
食物吃完了,等待重新烹饪。
做完了第100个食物。
二号吃掉了第100个食物
厨房食物材料已经做完。
一号吃了33
二号吃了67
Java程序设计之消费者和生产者的更多相关文章
- [Java基础] java多线程关于消费者和生产者
多线程: 生产与消费 1.生产者Producer生产produce产品,并将产品放到库存inventory里:同时消费者Consumer从库存inventory里消费consume产品. 2.库存in ...
- java 模拟实现消费者和生产者问题
题目要求 用java代码模拟实现:一个人不断往箱子里放苹果,另一个人不断从箱子里取苹果,箱子只能放5个苹果,苹果数量无限.要求不使用java.util.concurrent包中的类. 思路 这道题主要 ...
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...
- java线程之多个生产者消费者2.0
上一节中,通过while和notifyAll解决了多个生产者,消费者对共享资源的访问问题,现在开始升级 但是,仍然有改进之处,主要体现在两点: 1)使用新版本1.5开始后的锁Lock解决,目的将其全部 ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- java 多线程并发系列之 生产者消费者模式的两种实现
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据 ...
- java并发:初探消费者和生产者模式
消费者和生产者模式 用继承Thread方式,用wait和notifyAll方法实现. 消费者和生产者模式的特点 1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停 ...
- java多线程-消费者和生产者模式
/* * 多线程-消费者和生产者模式 * 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象 * */ /*资源类中定义了name( ...
- Java多线程消费者、生产者的基本思路
多线程主要考察的就是 线程的同步控制 生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了 ThreadOne.ThreadTwo同时运行,添加一个变量在一个公共类(下边的Funct ...
随机推荐
- poj1228--稳定凸包
题目大意:给你一个凸包上的某些点(可能在凸包内),询问是否能确定这个凸包. 思路:先求出题目给出的点的凸包,看看在凸包的每条边内(不包括端点)有没有点,若有,则这条边是确定的,若没有,则这条边不确定, ...
- jqgrid(转载)
一.主要API接口getGridParam.setGridParam: getGridParam方法: getGridParam("url"): 获取当前的AJAX的URL get ...
- WinFrom窗体始终置顶
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
- php 实现设计模式之 建造者模式
<?php /** * 建造者模式 * ------------- * 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. * 类型:创建类模式 * 四个要素: * ...
- 几款开源的hybird移动app框架分析
几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...
- jQueryMobile示例页面代码
这是一个jQueryMobile示例页面 示例效果:http://hovertree.com/texiao/jquerymobile/ 可以在手机或者触屏浏览器查看效果. 以下是HTML代码: < ...
- su到普通用户不能起图形 解决办法
环境介绍: 登录系统的时候采用的是root用户,然后su - oracle帐户后,然后执行startx命令启动图形界面之后就报如下的错误,根据提示是PAM起作用了.如下是错误信息:[ora ...
- App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file
ios进行http请求,会出现这个问题: App Transport Security has blocked a cleartext HTTP (http://) resource load sin ...
- Android的Message Pool是什么——源码角度分析
原文地址: http://blog.csdn.net/xplee0576/article/details/46875555 Android中,我们在线程之间通信传递通常采用Android的消息机制,而 ...
- @synchronized(self)的用法 小结
@synchronized() 的作用是创建一个互斥锁,保证在同一时间内没有其它线程对self对象进行修改,起到线程的保护作用, 一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用 ...