简单模拟医院叫号系统
以前有個(gè)習(xí)慣就是發(fā)現(xiàn)一些生活的系統(tǒng),總會(huì)大概想想自己開(kāi)發(fā)到底怎么實(shí)現(xiàn)。有的可能就在腦海里面過(guò)一下思路,有的則會(huì)寫個(gè)簡(jiǎn)單的demo驗(yàn)證一下自己的思路是否可行。
筆者前段時(shí)間在醫(yī)院等候,仔細(xì)觀察了一下叫號(hào)系統(tǒng)。于是有了想自己寫一個(gè)簡(jiǎn)單的叫號(hào)系統(tǒng)。
用例大致如下:
每個(gè)診室的醫(yī)生登錄系統(tǒng),都可以叫號(hào),不能重復(fù)叫號(hào),也不能跳號(hào),順序遞增
每個(gè)醫(yī)生看病的速度不一樣,線程需要睡眠一個(gè)隨機(jī)時(shí)間模擬醫(yī)生看病時(shí)間
每個(gè)醫(yī)生登錄時(shí)間不一樣,每次叫號(hào)都是基于最新的當(dāng)前號(hào)碼
某個(gè)醫(yī)生看病的時(shí)候,其它醫(yī)生正常叫號(hào)
某個(gè)醫(yī)生可以中途下班
所有醫(yī)生有下班的需求
程序大致如下:
Worker.java
1 package demo;
2
3 import java.util.concurrent.locks.Lock;
4 import java.util.concurrent.locks.ReentrantLock;
5
6 public class Worker implements Runnable {
7 private static int counter = 0;
8 private Lock myLock = new ReentrantLock();
9 private volatile boolean isWorking = true;
10
11 @Override
12 public void run() {
13 while (isWorking) {
14 myLock.lock();
15 ++counter;
16 // 開(kāi)始叫號(hào),當(dāng)前號(hào)(counter)患者進(jìn)入某個(gè)診室
17 String doctor = Thread.currentThread().getName();
18 int currentNO = counter; // 保留當(dāng)前醫(yī)生的病人號(hào)碼
19 System.out.println(doctor + " is calling patient NO --- "+currentNO);
20 myLock.unlock();
21 try {
22 long checkTime = (long)(10000 * Math.random());
23 Thread.sleep(checkTime);
24 System.out.println(doctor + " used " + checkTime + " milliseconds on patient NO --- "+currentNO);
25 // 醫(yī)生看病時(shí)間結(jié)束,開(kāi)始叫下一位患者
26 System.out.println(doctor + " has finished diagnosing patient NO--- "+currentNO);
27 System.out.println("============================================");
28 } catch (InterruptedException e) {
29 // TODO Auto-generated catch block
30 e.printStackTrace();
31 }
32 }
33 }
34
35 // 所有醫(yī)生下班了
36 public void stop() {
37 isWorking = false;
38 }
39 }
主類Yell.java
package demo;
public class Yell {
public static void main(String[] args) {
//模擬三個(gè)醫(yī)生Alice, Tom, Bob
Worker runner = new Worker();
Thread t1 = new Thread(runner);
t1.setName("Alice");
t1.start();
Thread t2 = new Thread(runner);
t2.setName("Tom");
t2.start();
Thread t3 = new Thread(runner);
t3.setName("Bob");
t3.start();
try {
Thread.sleep(20000);
// 模擬某個(gè)醫(yī)生下班中途退出, 這里的退出有待進(jìn)一步改進(jìn)
t1.stop();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Thread.sleep(20000);
// 所有醫(yī)生下班了
runner.stop();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
歡迎關(guān)注微信公眾號(hào):職場(chǎng)聞道
程序員出身的職場(chǎng)老兵,至今工作13年+,擅長(zhǎng)團(tuán)隊(duì)建設(shè)和管理,心理輔導(dǎo),分析職場(chǎng)各種疑難雜癥問(wèn)題。公眾號(hào)取自聞道有先后,術(shù)業(yè)有專攻。專注分享職業(yè)發(fā)展,職業(yè)規(guī)劃,職場(chǎng)人情冷暖,百態(tài)人生。
總結(jié)
以上是生活随笔為你收集整理的简单模拟医院叫号系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电大的学院费用(苏州电大每年的学费是多少
- 下一篇: Playwright入门 —— 简介