SCNU Java多线程作业

多线程的部分讲了几节课,知识点很多,感觉听懂了但是可能写不出来,先留一个作业,知识点之后要好好总结才行。

题目是这样的:

原版:顾客进服装店的购物过程包含三个环节,选衣服,试衣服,结账离开。其中选衣服环节和试衣服环节需要的时间为 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,不满放人进去,有空再试吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值