Java多线程——模拟看病叫号
需求说明:
某科室一天需看普通号50个,特需号10个
特需号看病时间是普通号的2倍
开始时普通号和特需号并行叫号,叫到特需号的概率比普通号高
当普通号叫完第10号时,要求先看完全部特需号,再看普通号
使用多线程模拟这一过程
思路:
这题如果把专家号和普通号都写为子线程就难了,
把专家号写成子线程,把普通号写成主线程这样就简单了,因为子线程和主线程是并行的,所以不会有任何的影响。
主线程:
package KB;
public class kbTest {
public static void main(String[] args) {
// 专家号和普通号两个线程同时执行,普通号是主线程,专家号是子线程
Lookbing lookbing = new Lookbing();
Thread thread1 = new Thread(lookbing);
// 叫到特需号的概率比普通号高
thread1.setPriority(Thread.MAX_PRIORITY);
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
thread1.start();
// 20个普通号
for (int i = 1; i <= 50; i++) {
System.out.println("普通号:"+i+"号病人正在看病");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 当普通号叫完第10号时,要求先看完全部特需号,再看普通号
if(i==10){
//
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
子线程:
public class Lookbing 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();
}
}
}
}