JAVA【多线程】模拟顾客试衣服(合理分析设计)

阅读: 评论:0

JAVA【多线程】模拟顾客试衣服(合理分析设计)

JAVA【多线程】模拟顾客试衣服(合理分析设计)

作业题:

顾客进服装店的购物过程包含三个环节,选衣服,试衣服,结账离开。其中选衣服环节和试衣服环节需要的时间为 1-5秒不等(随机),结账离开环节5秒,该店只有一间试衣间(不能两人同时使用)。   请编写一个程序模拟每隔一段时间有一个个顾客进店购买的过程。程序执行过程中,输出每个顾客所处的环节信息。 比如,顾客1在试衣服,顾客2,在选衣服,顾客2在试衣服。  提示,用线程调度。

(PS:老师布置的作业题,一字不差地copy过来。强迫症患者表示看老师这个题目描述很难受。)

大意:

随机有顾客进店。进店后,顾客先后有选衣服、试衣服、排队的行为。试衣间(只有一个)一旦空出来,就放队首(前提当然是队列不为空啦)那个顾客进来试衣服。

分析:

在理解题目意思之后,可能没什么头绪,不知道怎么下手敲代码。当然,一股脑直接敲代码是禁忌。为了理清思路和使得写的代码层次更清晰,需要进行必要的分析和设计!


以实体类为切入点,显然顾客是个实体类(Customer类)。这个类的三个行为分别为对应的三个方法。其中选衣服和试衣服,需要花费时间,在这两个方法中sleep随机时间即可。排队这个行为:主要是把当前对象添加到队列中。

随机有顾客进店!是不是很想像“生产者” ?创建一个生产者的线程:间隔随机时间生产一个顾客。

试衣间的角色是不是很像 “消费者” ?试衣间每消费一个顾客需要花费一定时间,这个时间就是这个顾客试衣服的时间。因此需要创建一个消费者的线程。

至此,可以发现,这题是一个 “生产者与消费者模式” 的变形。


对于控制台输出,为了更好的观察,我不像题目要求那样。因为那样输出太多了,我们直接看输出根本不知道队伍的实际情况。因此,对于输出,每次一个顾客从试衣间出来(下一个顾客还没进去),就打印一下队伍的情况。为了能看得出效果,让生产顾客的间隔,挑选衣服的时间间隔稍微短一点,然后让试衣服的时间稍微长一点。那么随着时间的推移,队伍就会越排越长。通过打印我们可以很直观的看出来。对于结账的行为,没啥用,我直接去掉了。


代码并非严格按照题目意思来,但问题不大,体现了题目的核心。

代码 

package demo1;import java.util.Random;public class RandomUtil {private static Random r = new Random();/*** 生成一个处于[low, high]的整数* @param low* @param high* @return*/public static int getInt(int low, int high) // 10, 20   { // high - low  10  0-9  10,19return  low + r.nextInt(high - low + 1); }
}
package demo1;SimpleDateFormat;
import java.util.Date;
import java.util.Queue;public class Customer {private String num; // 顾客编号private SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); public Customer(String num) {this.num = num;}// 下面是顾客的行为/*** 顾客的排队行为* @param queue 顾客排的哪条队?需要作为参数传递进来*/public void queueUp(Queue<Customer> queue){//System.out.println(num + "开始排队 " + getTime());queue.offer(this);}/*** 顾客的挑衣服行为(该行为的关键点是:花费时间)*/public void select(){//System.out.println(num + "开始挑选衣服 " + getTime());// 挑选衣服花费时间(随机生成)int cost = Int(1, 2) * 1000;try {Thread.sleep(cost);} catch (InterruptedException e) {e.printStackTrace();}//System.out.println(num + "挑好衣服 " + getTime());}/*** 顾客的试衣服行为(该行为的关键点是:花费时间)*/public void trying(){//System.out.println(num + "开始试衣服 " + getTime());// 挑选衣服花费时间(随机生成)int cost = Int(3, 4) * 1000;try {Thread.sleep(cost);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(num + "试完衣服 " + getTime());}public String getTime(){return sdf.format(new Date());}public String getNum() {return num;}public void setNum(String num) {this.num = num;}
}
package demo1;import java.util.LinkedList;
import java.util.Queue;public class ProducerAndConsumerDemo {private static Queue<Customer> queue = new LinkedList<>();private static int count = 0;public static void showQueue() {System.out.println("队列(最左边为队首):");for (Customer cust : queue) {System.out.Num() + " ");}System.out.println("n");}public static void main(String[] args) {// 创建一个线程:间隔随机时间生产一个顾客(相当于生产者)Thread producer = new Thread(new Runnable() {@Overridepublic void run() {while (true) {Customer cust = new Customer("顾客" + (++count));cust.select();cust.queueUp(queue);// 随机时间间隔后再生产try {Thread.Int(0, 1) * 1000);} catch (InterruptedException e) {e.printStackTrace();}}}});producer.start();// 创建一个线程(表示试衣间)来消费顾客:试衣间一旦为空,就放队首那个顾客(前提是队列不为空)进来试衣服// 这个线程消费一个顾客是需要时间的,这个时间就是这个顾客试衣服的时间Thread consumer = new Thread(new Runnable() {@Overridepublic void run() {while (true) {Customer cust = queue.poll();if (cust != null) {ing();showQueue(); // 每次一个顾客从试衣间出来(下一个顾客还没进去),就打印一下队伍的情况}}}});consumer.start();}}

 

本文发布于:2024-01-31 01:51:45,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170663710824477.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:多线程   顾客   JAVA
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23