A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[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;
				}
			}
		}
	}
	
}

29 个回复

倒序浏览
从买票,卖包包到卖包子,多线程真会玩
回复 使用道具 举报
你们有没有想过,当前面卖了99个包子,剩最后一个的时候,随机数出了一个4...
回复 使用道具 举报
精神可嘉啊 。。
回复 使用道具 举报
感觉线程好难
回复 使用道具 举报

多敲吧,敲多了,就有手感了
回复 使用道具 举报
读书可以当饭吃 发表于 2016-10-9 14:24
你们有没有想过,当前面卖了99个包子,剩最后一个的时候,随机数出了一个4... ...

所以,我在代码中才会做最后一步的判断,如果包子的剩余数不是大于或者等于随机数,根本就卖不出去,只能重新摇随机数
回复 使用道具 举报
读书可以当饭吃 发表于 2016-10-9 14:24
你们有没有想过,当前面卖了99个包子,剩最后一个的时候,随机数出了一个4... ...

所以,我在代码中才会做最后一步的判断,如果包子的剩余数不是大于或者等于随机数,根本就卖不出去,只能重新摇随机数
回复 使用道具 举报
多线程真的很重要,昨天机试都遇到了
回复 使用道具 举报
友情提示,你的随机数应该在循环内获取,你现在在循环外,所以每次的的包子数都是不变的,根本不会重新获取
回复 使用道具 举报
HackSon 发表于 2016-10-10 10:34
友情提示,你的随机数应该在循环内获取,你现在在循环外,所以每次的的包子数都是不变的,根本不会重新获取 ...

对啊,5条线程,每条线程一次只获取一个随机数,如果不符合要求,那就直接跳出咯,只有获取到的随机数在剩余包子的范围内,交易才能成立
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
出问题一般在边界上
回复 使用道具 举报
你怎么搞了2个同步代码块
回复 使用道具 举报
yu244934256 发表于 2016-10-11 00:38
你怎么搞了2个同步代码块

请看注解
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
李春林 发表于 2016-10-10 19:44
对啊,5条线程,每条线程一次只获取一个随机数,如果不符合要求,那就直接跳出咯,只有获取到的随机数在 ...

你这样会出现卖不出包子的情况,比如:最后剩下一个包子,可是每个线程的随机数都大于1,因为你获取随机数是在循环外面,所以一次循环不符合后再次循环随机数还是不变的,这样包子数一直为1,无法跳出循环,也无法卖出。
回复 使用道具 举报
wjhsyy 中级黑马 2016-10-11 10:47:51
16#
多线程一直比较迷糊,看完感觉思路清晰多了
回复 使用道具 举报
好难的样子,谢谢楼主分享
回复 使用道具 举报
HackSon 发表于 2016-10-11 10:13
你这样会出现卖不出包子的情况,比如:最后剩下一个包子,可是每个线程的随机数都大于1,因为你获取随机 ...

你确定你运行了我的程序了吗??
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
HackSon 发表于 2016-10-11 10:13
你这样会出现卖不出包子的情况,比如:最后剩下一个包子,可是每个线程的随机数都大于1,因为你获取随机 ...

多线程是什么,你都还没有完全搞懂,每条线程,一次只能获取一个随机数,当随机数在包子剩余范围内时,这条线程才能继续执行下去,不然,线程直接结束,换下一条线程。如果按照你说的,把获取随机数也放在循环里面,那只能是一条线程一直在跑
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马