[Java] 纯文本查看 复制代码 package com.heima.moreThread多线程;
import java.util.Random;
public class Test02 {
/**
* /*3. 某包子店铺生意火爆,现开5个窗口模拟售卖100个包子,每次每个窗口随机卖出1-5个包子,
卖完最后一个包子后提示”包子已售完”(必须全部卖出),程序结束.(要求使用Thread类和Runnable两种方式去实现)
* */
public static void main(String[] args) {
MyBaoZi mb = new MyBaoZi();
Thread t1 = new Thread(mb,"窗口1");
Thread t2 = new Thread(mb,"窗口2");
Thread t3 = new Thread(mb,"窗口3");
Thread t4 = new Thread(mb,"窗口4");
Thread t5 = new Thread(mb,"窗口5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class MyBaoZi implements Runnable {
//总共的包子数,这是共享数据
private int baozi = 100;
//设置标记,为输出一次"包子已经卖完了"做准备
private boolean flag = true;
//创建随机数对象
Random r = new Random();
@Override
public void run() {
//获取随机数,相当于获取随机卖出的包子个数
int i = r.nextInt(5) + 1;
while (true) {
synchronized (MyBaoZi.class) {
//如果剩余的包子数等于0或者是小于0,就直接跳出
if(baozi <= 0) {
break; //跳出
}
try {
Thread.sleep(20); //防止卖得太快,让程序睡一会
} catch (InterruptedException e) {
e.printStackTrace();
}
//这一步的判断的目的是在于只剩下一个包子的时候,怎么样才能卖出去,
//当获取到的随机数是在包子的剩余范围的时候,交易才能成功
if (baozi >= i) {
//获取到卖出之后的剩余包子数
baozi = baozi - i;
//输出卖出去包子的信息
System.out.println(Thread.currentThread().getName() + "...出售了" + i + "个包子,还剩下" + baozi + "个包子");
}
}
//必须保证是卖最后一个包子的线程执行这一段代码
synchronized(MyBaoZi.class) {
if (flag && baozi <= 0) {
System.out.println("包子已经卖完了");
flag = false;
}
}
}
}
}
|