题目要求
需求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