多线程的部分讲了几节课,知识点很多,感觉听懂了但是可能写不出来,先留一个作业,知识点之后要好好总结才行。
题目是这样的:
原版:顾客进服装店的购物过程包含三个环节,选衣服,试衣服,结账离开。其中选衣服环节和试衣服环节需要的时间为 1-5秒不等(随机),结账离开环节5秒,该店只有一间试衣间(不能两人同时使用)。 请编写一个程序模拟每隔一段时间有一个个顾客进店购买的过程。程序执行过程中,输出每个顾客所处的环节信息。 比如,顾客1在试衣服,顾客2,在选衣服,顾客2在试衣服。 提示,用线程调度
因为自己写的时候在想怎么把生产消费模型加进去,看别人写的吧来不及了,所以我快速写了一下,看起来是实现了这个效果,但因为忘记还有这个作业所以是在离作业截至只有20分钟的情况下极限写的,有没有bug就不清楚了……:
话不多说,上代码
为了显示出有时间差,这里我就设置了random的等待时间,删掉也可以
package lesson09;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
class buyer{
private String num; //编号
private SimpleDateFormat t=new SimpleDateFormat("hh:mm:ss");
public buyer(String num){
super();
this.num=num;
}
public String getTime(){
return t.format(new Date());
}
public String getnum(){
return this.num;
}
public void coming(){
System.out.println(this.num+"欢迎光临!"+getTime());
System.out.println("请随便挑选你要的衣服!");
System.out.println(this.num+"开始挑衣服"+getTime());
Random rd=new Random();
int pickingcost=rd.nextInt(2)*1000;
try {
Thread.sleep(pickingcost);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.num+"挑好衣服"+getTime());
System.out.println(this.num+"开始排队试衣服"+getTime());
}
public void trying()
{
System.out.println(num+"开始试衣服"+getTime());
Random rd=new Random();
int cost = rd.nextInt(2) * 1000;
try {
Thread.sleep(cost);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.num + "试完衣服 " + getTime());
System.out.println("下一位");
}
}
public class testbuy {
public static void main(String[] args)throws IOException, InterruptedException{
Queue<buyer> queue=new LinkedList<>();
int count=0;
while(count<5){
buyer cust = new buyer("customer" +Integer.toString(++count) );
cust.coming();
queue.offer(cust);
Random rd=new Random();
int breaktime=rd.nextInt(2)*1000;
Thread.sleep(breaktime);
Thread buyer = new Thread(new Runnable() {
@Override
public void run() {
//在这里加个锁
synchronized(queue) {
buyer cust1 = queue.poll();
cust1.trying();
}
}});
buyer.start();
}
}
}
效果图:
这么看好像有点看不出等待效果?没关系,我们把coming中的挑衣服时间改成0,主函数中客户进来的间隔breaktime也改成0,只保留换衣服时间,效果是这样的:大家都在等待1号出来。
提高题目:对店内人数有了限制,同时试衣间有两个
这个可能才是真的要用比较多的生产消费模型的题目,我的思路大概得控制一个长度为5的queue1存用户,另一个长度为queue2存试衣间,满了阻塞wait,不满放人进去,有空再试吧!