练习1,模拟叫号看病(仅供自己参考)

题目要求

题目说明

需求1

根据第一行要求可知,需要传入两个对象:1,普通号,20个;2,特需号,10个。

普通号:
public class CommonThread extends Thread{

    private double time;//表示看病时间
    private int num;//挂号数量


    public CommonThread(String name, double time, int num){
        super(name);
        this.time = time * 1000;//1000是为了将毫秒转换成秒
        this.num = num;
    }

特需号:
public class SpecialThread extends Thread{
    private double time;//表示看病时间
    private int num;//挂号数量

    public SpecialThread(String name,double time,int num){
        super(name);
        this.num = num;
        this.time = time * 1000;//1000是为了将毫秒转换成秒
    }

重写run方法

普通号:
 @Override
    public void run() {
        for (int i = 1; i <= this.num; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i + "号");
            
            try {
                Thread.sleep((long) this.time);//sleep传入的值得是long类型,需强转
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("今日普通号已看完!");
    }
特需号:
 @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i + "号");

            try {
                Thread.sleep((long) this.time);//sleep传入的值得是long类型,需强转
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("今日特需号已看完!");
    }

需求2

时间两倍,只需要在main方法传入值的时候操作即可,如下:

CommonThread normal = new CommonThread("普通号", 0.5, 20);
SpecialThread special = new SpecialThread("特需号", 1, 10);

需求3

同时叫号,让两个线程一起start即可
叫到特需号的概率比普通号高,需要调用Thread中的setPriority方法,具体实现如下:

special.setPriority(Thread.MAX_PRIORITY);
//最高优先级
normal.setPriority(Thread.MIN_PRIORITY);
//最低优先级

优先级也只是概率高一点,并不是一定就高。

需求4

根据题意,此处需要用到Thread中的join方法

if (i == 10){
	try {
		special.join();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

而我水平有限,没想出怎么把两个分开的类,在main方法中互相拉取的办法,所以把普通类直接写进main线程

完整代码

如下:

 public static void main(String[] args) {
        Thread special = new Thread(new SpecialThread(), "special");

        special.setPriority(Thread.MAX_PRIORITY);
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        special.start();

        for (int i = 1; i <= 20; i++) {
            System.out.println("普通号:" + i + "号病人正在看病");

            if (i == 10){
                try {
                    special.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
public class SpecialThread implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println("特需号:" + i + "号病人正在看病");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

执行结果:

普通号:1号病人正在看病
特需号:1号病人正在看病
普通号:2号病人正在看病
特需号:2号病人正在看病
普通号:3号病人正在看病
普通号:4号病人正在看病
特需号:3号病人正在看病
普通号:5号病人正在看病
普通号:6号病人正在看病
特需号:4号病人正在看病
普通号:7号病人正在看病
普通号:8号病人正在看病
特需号:5号病人正在看病
普通号:9号病人正在看病
普通号:10号病人正在看病
特需号:6号病人正在看病
特需号:7号病人正在看病
特需号:8号病人正在看病
特需号:9号病人正在看病
特需号:10号病人正在看病
普通号:11号病人正在看病
普通号:12号病人正在看病
普通号:13号病人正在看病
普通号:14号病人正在看病
普通号:15号病人正在看病
普通号:16号病人正在看病
普通号:17号病人正在看病
普通号:18号病人正在看病
普通号:19号病人正在看病
普通号:20号病人正在看病

Process finished with exit code 0

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值