以前有個習慣就是發現一些生活的系統,總會大概想想自己開發到底怎么實現。有的可能就在腦海里面過一下思路,有的則會寫個簡單的demo驗證一下自己的思路是否可行。
筆者前段時間在醫院等候,仔細觀察了一下叫號系統。於是有了想自己寫一個簡單的叫號系統。
用例大致如下:
- 每個診室的醫生登錄系統,都可以叫號,不能重復叫號,也不能跳號,順序遞增
- 每個醫生看病的速度不一樣,線程需要睡眠一個隨機時間模擬醫生看病時間
- 每個醫生登錄時間不一樣,每次叫號都是基於最新的當前號碼
- 某個醫生看病的時候,其它醫生正常叫號
- 某個醫生可以中途下班
- 所有醫生有下班的需求
程序大致如下:
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 // 開始叫號,當前號(counter)患者進入某個診室 17 String doctor = Thread.currentThread().getName(); 18 int currentNO = counter; // 保留當前醫生的病人號碼 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 // 醫生看病時間結束,開始叫下一位患者 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 // 所有醫生下班了 36 public void stop() { 37 isWorking = false; 38 } 39 }
主類Yell.java
package demo; public class Yell { public static void main(String[] args) {
//模擬三個醫生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); // 模擬某個醫生下班中途退出, 這里的退出有待進一步改進 t1.stop(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Thread.sleep(20000); // 所有醫生下班了 runner.stop(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
歡迎關注微信公眾號:職場聞道
程序員出身的職場老兵,至今工作13年+,擅長團隊建設和管理,心理輔導,分析職場各種疑難雜症問題。公眾號取自聞道有先后,術業有專攻。專注分享職業發展,職業規划,職場人情冷暖,百態人生。