需求说明:
某科室一天看普通号20个,特需号10个
特需号看病时间是普通号的2倍
开始时普通号和特需号并行叫号,叫到特需号的概率比u普通号高
当普通号叫完第10号时,要求先看完全部特需号,再看普通号
使用多线程模拟这一过程
实现代码如下:
接口实现自定义线程
//自定义线程类表示特需号病人看病的线程
public class HosThread implements Runnable {
/**
* 此处run方法表示特需号病人看病
*/
@Override
public void run() {
for (int i = 1; i <=10; i++) {
String current = Thread.currentThread().getName();
System.out.println(current + ":" + i + "号病人在看病!");
try {
Thread.sleep(1000); //休眠1秒
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
//定义测试类
public class Test {
public static void main(String[] args) { //main方法是主线程,表示普通号病人看病
Runnable runnable = new HosThread();
Thread special = new Thread(runnable, "特需号");
special.setPriority(10); //特需号优先级设置为10;普通号线程默认为5
special.start();
//for循环表示main方法的主线程,此处定义为普通号病人看病
for (int i = 0; i < 20; i++) {
if (i == 10){
try {
special.join(); //将special线程通过join()方法插入到主线程前面,即当普通号看完10个人后,特需号插队,等指定的特需号看病完成后,再继续执行main方法(即普通号看病)
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("普通号:"+ (i+1) + "号病人在看病!");
try {
Thread.sleep(500); //休眠0.5秒 即表示特需号看病时间是普通号的两倍
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
继承Thread类实现自定义线程
public class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
String name = Thread.currentThread().getName();
System.out.println(name+":"+(i+1)+"号病人在看病");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class TestMyThread {
public static void main(String[] args) {
MyThread special = new MyThread("特需号");
special.setPriority(10);
special.start();
for (int i = 0; i < 20; i++) {
if (i == 10){
try {
special.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("普通号:"+(i+1)+"号病人在看病");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}