您的位置:首页 > 编程语言 > Java开发

Java多线程,生产者,消费者回顾.简单的一条街包子铺!

2010-05-26 15:45 281 查看
一条街,有很多家包子铺,包子铺,开张的时候,都已经做好了19个包子,包子呢,是边做边卖.做1个包子,是铁定的800ms,而卖出1个包子不会超过1s(生意好).

package book.thread;

import java.util.List;
import java.util.Vector;

/**
* 包子铺
*
* @author Vicky
*
*/
public class WaitNotify2 {

static class Shop implements Runnable {

private boolean isRunning = false;

private String name;

/** 记录今天做的总共的包子 * */
private int count = 0;

/** 做包子的任务 * */
private Thread subThread1 = null;

/** 卖包子的任务 * */
private Thread subThread2 = null;

/** 包子铺中的包子 * */
private List<Integer> baozis = new Vector<Integer>();

public Shop(String name) {
super();
this.name = name;
initShop();
}

/**
* 初始化包子铺
*/
private void initShop() {
for (int i = 1; i < 20; i++) {
baozis.add(count++);
}
}

/**
* 做包子,每秒做1个包子
*/
public void makeBaozi() {
subThread1 = new Thread() {
@Override
public void run() {
while (baozis.size() < 20 && isRunning) {
synchronized (baozis) {
try {
Thread.sleep(800); // 800毫秒才能做1个包子
System.out.println("包子铺>> " + name + " <<开始/"做/"第[" + ++count + "]个包子!");
baozis.add(count);
if (baozis.size() >= 20) {
System.out.println("包子铺>> " + name + " <<包子满了,停止做包子!");
baozis.wait();
} else {
baozis.notifyAll(); // 又做了1个包子,又可以卖包子了
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
subThread1.start();
}

/**
* 出售包子,0.5秒卖出一个包子
*/
public void sellBaozi() {
subThread2 = new Thread() {
@Override
public void run() {
while (baozis.size() > 0 && isRunning) {
synchronized (baozis) {
try {
Thread.sleep((long) (Math.random() * 1000)); // 少于1秒就可以卖出1个包子
System.out.println("包子铺>> " + name + " <</"出售/"第[" + baozis.get(0) + "]个包子!");
baozis.remove(0);
if (baozis.size() < 1) {
System.out.println("包子铺>> " + name + " <<没包子可以卖了,等待做包子!");
baozis.wait();
} else {
baozis.notifyAll(); // 卖掉了1个包子,那么仓库又可以做了!
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
subThread2.start();
}

public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
Thread thread = new Thread(this);
thread.start();
}

public void openShop() {
isRunning = true;
Thread thread = new Thread(this);
thread.start();
}

public void run() {
makeBaozi();
sellBaozi();
}

}

public static void main(String[] args) {
Shop shop = new Shop("一号");
shop.openShop();
Shop shop2 = new Shop("二号");
shop2.openShop();
Shop shop3 = new Shop("三号");
shop3.openShop();
}

}


包子铺>> 三号 <<开始"做"第[20]个包子!
包子铺>> 三号 <<包子满了,停止做包子!
包子铺>> 二号 <<开始"做"第[20]个包子!
包子铺>> 二号 <<包子满了,停止做包子!
包子铺>> 一号 <<开始"做"第[20]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 一号 <<"出售"第[0]个包子!
包子铺>> 二号 <<"出售"第[0]个包子!
包子铺>> 三号 <<"出售"第[0]个包子!
包子铺>> 三号 <<"出售"第[1]个包子!
包子铺>> 三号 <<"出售"第[2]个包子!
包子铺>> 二号 <<"出售"第[1]个包子!
包子铺>> 一号 <<"出售"第[1]个包子!
包子铺>> 三号 <<"出售"第[3]个包子!
包子铺>> 一号 <<"出售"第[2]个包子!
包子铺>> 三号 <<"出售"第[4]个包子!
包子铺>> 一号 <<"出售"第[3]个包子!
包子铺>> 三号 <<"出售"第[5]个包子!
包子铺>> 二号 <<"出售"第[2]个包子!
包子铺>> 三号 <<"出售"第[6]个包子!
包子铺>> 一号 <<"出售"第[4]个包子!
包子铺>> 三号 <<"出售"第[7]个包子!
包子铺>> 三号 <<"出售"第[8]个包子!
包子铺>> 二号 <<开始"做"第[21]个包子!
包子铺>> 三号 <<"出售"第[9]个包子!
包子铺>> 一号 <<开始"做"第[21]个包子!
包子铺>> 三号 <<"出售"第[10]个包子!
包子铺>> 二号 <<开始"做"第[22]个包子!
包子铺>> 三号 <<"出售"第[11]个包子!
包子铺>> 一号 <<开始"做"第[22]个包子!
包子铺>> 二号 <<开始"做"第[23]个包子!
包子铺>> 二号 <<包子满了,停止做包子!
包子铺>> 二号 <<"出售"第[3]个包子!
包子铺>> 二号 <<"出售"第[4]个包子!
包子铺>> 一号 <<开始"做"第[23]个包子!
包子铺>> 三号 <<"出售"第[12]个包子!
包子铺>> 一号 <<开始"做"第[24]个包子!
包子铺>> 三号 <<开始"做"第[21]个包子!
包子铺>> 二号 <<"出售"第[5]个包子!
包子铺>> 一号 <<开始"做"第[25]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 三号 <<开始"做"第[22]个包子!
包子铺>> 二号 <<"出售"第[6]个包子!
包子铺>> 二号 <<"出售"第[7]个包子!
包子铺>> 三号 <<开始"做"第[23]个包子!
包子铺>> 一号 <<"出售"第[5]个包子!
包子铺>> 一号 <<"出售"第[6]个包子!
包子铺>> 二号 <<"出售"第[8]个包子!
包子铺>> 三号 <<开始"做"第[24]个包子!
包子铺>> 一号 <<"出售"第[7]个包子!
包子铺>> 一号 <<"出售"第[8]个包子!
包子铺>> 二号 <<"出售"第[9]个包子!
包子铺>> 二号 <<"出售"第[10]个包子!
包子铺>> 二号 <<"出售"第[11]个包子!
包子铺>> 二号 <<"出售"第[12]个包子!
包子铺>> 三号 <<开始"做"第[25]个包子!
包子铺>> 一号 <<"出售"第[9]个包子!
包子铺>> 二号 <<开始"做"第[24]个包子!
包子铺>> 三号 <<开始"做"第[26]个包子!
包子铺>> 一号 <<开始"做"第[26]个包子!
包子铺>> 二号 <<开始"做"第[25]个包子!
包子铺>> 三号 <<"出售"第[13]个包子!
包子铺>> 一号 <<开始"做"第[27]个包子!
包子铺>> 三号 <<"出售"第[14]个包子!
包子铺>> 二号 <<开始"做"第[26]个包子!
包子铺>> 三号 <<"出售"第[15]个包子!
包子铺>> 一号 <<开始"做"第[28]个包子!
包子铺>> 三号 <<"出售"第[16]个包子!
包子铺>> 二号 <<开始"做"第[27]个包子!
包子铺>> 一号 <<开始"做"第[29]个包子!
包子铺>> 三号 <<"出售"第[17]个包子!
包子铺>> 二号 <<开始"做"第[28]个包子!
包子铺>> 三号 <<"出售"第[18]个包子!
包子铺>> 一号 <<开始"做"第[30]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 一号 <<"出售"第[10]个包子!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: