Java生产者-消费者问题“HotDog”:生产者生产15个热狗(数字即可),放在可放四个热狗的盘子里,盘子满就暂停生产;消费者吃盘子里的热狗,吃光则等待生产

1、案例描述

生产者-消费者问题“HotDog”:生产者生产15个热狗(数字即可),放在可放四个热狗的盘子里,盘子满就暂停生产;消费者吃盘子里的热狗,吃光则等待生产
——————————————————————————————————
创建热狗了HotDog
再该类中创建成员变量 int panzi =0,size=0 分别代表盘子的数量和热狗的数量
——————————————————————————————————
建立同步代码方法 生产热狗:
public synchronized void producetHotdog(int i) 该方法完成 如果盘子数量为4输出 四个盘子都满了,无法生产,请等待!。调用wait()方法,让生产者线程等待。否则盘子数量递增,也就是进行生产热狗。输出 生产热狗i 放入盘子中。利用notify()唤醒消费者线程消费热狗
——————————————————————————————————
建立同步代码方法 消费热狗:
public synchronized void consumerHotdog(int i) 该方法完成 如果盘子数量为0 则输出盘子全空,无法消费热狗,请等待!。利用调用wait()方法,让消费者线程等待。否则盘子数量递减,也就是消费热狗,输出吃热狗i ,利用notify()唤醒生产者线程生产热狗
——————————————————————————————————
创建类生产者Producet 该类为线程
在该类中建立 私有成员变量HotDog 。建立构造方法,参数为HotDog对象。
重写run方法,该方法实现 循环生产15个热狗,并休眠1秒内的随机数Thread.sleep((int)Math.random()*1000);
————————————————————————————————————————
创建类消费者Consumer 该类为线程
在该类中建立 私有成员变量HotDog 。建立构造方法,参数为HotDog对象。
重写run方法,该方法实现 循环消费15个热狗,并休眠1秒内的随机数Thread.sleep((int)Math.random()*1000);
————————————————————————————————
主类测试,创建生产者消费者线程的对象,启动 测试

2、代码实现:

HotDag.java

package XianCheng;

public class HotDag {
	private int panzi=0;//模拟放置热狗的四个盘子
	private int size= 0 ;//代表当前热狗的数量
	
	public synchronized void producetHotdog(int i){
		while(panzi==4){
			System.out.println("四个盘子全满,无法生产,需要等待");
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}		
		panzi++;	
		System.out.println("生产热狗"+i+"放入盘子中");
		notify();//用于唤醒消费者线程
	}
	public synchronized void consumerHotdog(int i){
		while(panzi==0){
			System.out.println("盘子全空,无法消费热狗,请等待");
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		panzi--;	
		System.out.println("吃热狗"+i);
		notify();		
		
	}
}

Producet.java

package XianCheng;

public class Producet extends Thread{
	private HotDag hotDag; 
	public Producet(HotDag hotDag){
		this.hotDag=hotDag;
	}
	public void run() {
		for(int i=1;i<16;i++){
			hotDag.producetHotdog(i);
			
			try {
				Thread.sleep((int)Math.random()*1000);
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}

Consumer.java

package XianCheng;

public class Consumer extends Thread{
	private HotDag hotDag;
	public Consumer(HotDag hotDag){
		this.hotDag=hotDag;
	}
	public void run() {
		for(int i=1;i<16;i++){
			 hotDag.consumerHotdog(i);			
			try {
				
				Thread.sleep((int)Math.random()*1000);
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}

Test.java

package XianCheng;

public class Test {
public static void main(String[] args) {
		HotDag hotDag =new HotDag();
		Producet producet = new Producet(hotDag);
		Consumer consumer = new Consumer(hotDag);
		producet.start();
		consumer.start();
	}
}

实现效果


因为这是一个一个多线程,所以不能保证结果的唯一性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值