Java生产者-消费者问题“HotDog”
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();
}
}
实现效果
![]()
![]()
因为这是一个一个多线程,所以不能保证结果的唯一性。