需求说明
- 某科室一天需看普通号20个,特需号10个
- 特需号看病时间是普通号的2倍
- 开始时普通号和特需号并行叫号,叫到特需号的概率比普通号高
- 当普通号叫完第10号时,要求先看完全部特需号,再看普通号
- 使用多线程模拟这-过程
普通号代码
package thread;
public class Ordinary implements Runnable{
private String name;
private int num = 20;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public void run() {
for (int i = 0; i < num; i++) {
System.out.println(name+(i+1)+"号病人正在看病");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 9){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
特需号的代码
package thread;
public class Special implements Runnable{
private String name;
private int num = 10;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public void run() {
for (int i = 0; i < num; i++) {
System.out.println(name+(i+1)+"号病人正在看病");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类代码
package thread;
public class Test {
public static void main(String[] args) {
Ordinary ordinary = new Ordinary();
ordinary.setName("普通号");
Special special = new Special();
special.setName("特需号");
Thread th1 = new Thread(ordinary);
Thread th2 = new Thread(special);
th1.start();
th2.start();
if (ordinary.getNum() == 10){
try {
th2.join();
} 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