標籤:時間 sleep max 互連網 str 擴充 cache add tom
關於隊列,使用的地方很的多。
現實中有許多的範例。
比方醫院的挂號系統,銀行裡的叫號系統,食堂裡的排隊打飯等等。市場上又這種排隊取號的裝置。他們的功能基本例如以下:
1、系統可連網聯機統一發號。
2、系統可無線對接,也可有線串連;
3、系統支援100種業務以上;
4、系統支援多個等候區提示等候資訊,各等候區語音及顯示可獨立。
5、個人化語音可呼叫客戶所辦理的業務名稱(醫院版可呼叫病人姓名)等資訊。
6、號碼可在不同服務類別的櫃檯表單之間相互轉移,顧客不必反覆排隊;
7、具備登入操作功能和退出操作功能:工作開始前,輸入員工登陸號進行登入。工作結束後,退出排隊系統,這對統計很準確。
8、發號機介面的圖片客戶全然能夠按個人化自主設計更換。
9、各項業務的按鍵客戶全然能夠按個人化自主設計更換;
10、支援通過讀卡機讀取客戶相關資訊後,自己主動區分VIP客戶和普通客戶,自己主動區分對公客戶和對私客戶,並按營業機構自定的排隊規則自己主動編組排隊;
11、號票上和發號機上的顯示屏會顯示每一個顧客前面的等待人數;
12、各項業務隊列客戶全然能夠自主按需隨意增減。
13、各項業務的等待人數客戶全然能夠自主設定在介面上顯示並可隨意排版。
14、各項業務的工作時段及暫停時段客戶全然能夠自主設定。
15、操作員工的增減及登陸帳號客戶全然能夠自主更改;
16、語音電話的資訊客戶全然能夠自主按個人化更改;
17、顯示屏的不論什麼顯示資訊客戶全然能夠自主按個人化更改;
18、顧客辦理各項業務的序號客戶全然能夠自主設定,如:貴賓業務或理財金業務可設為1-200號內、外幣業務可設為201-500號內、人民幣業務設501-9999號內;
19、工作員工所辦理的業務隊列客戶全然能夠自主隨意設定優先權。
20、號票上的文字內容、圖案、業務名稱、時間格式、更改字型及大小、紙張長短等客戶全然能夠自主按個人化;
21、系統支援播放背景音樂。音樂曲目全然由客戶自主選擇;
22、系統支援在值班經理處增設監視軟體,處理各種特殊狀況;
23、系統支援高清晰度電漿顯示器、大螢幕、電視牆等多種顯示裝置。顯示豐富的排隊資訊。
24、系統支援串連互連網絡,可實現遠程監控;
25、系統設有擴充功能,當須要有關統計和管理資料時。可熱鍵啟用管理軟體並列印;
26、系統可依據須要配置客戶評價器及排隊資訊(簡訊)提示功能。
OK,瞭解了這些後,我們來實現一個簡單的範例吧。先看看:
廢話不多說了。看代碼:
CallNum.java
package com.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;/** * @see 類比銀行叫號系統 * @author Herman.Xiong * @date 2014年11月17日 14:48:48 * @version V1.0 */public class CallNum {public static void main(String[] args) throws InterruptedException { //建立服務中心,如一個銀行的營業廳Center center = new Center(); ExecutorService exec = Executors.newCachedThreadPool(); //類比產生服務人員 Producer producer = new Producer(center); //類比產生N多客戶 Consumer consumer = new Consumer(center); exec.execute(producer); //類比10名客戶 for (int i = 0; i < 10; i++) { exec.execute(consumer); } TimeUnit.SECONDS.sleep(10); exec.shutdown(); //如有疑問,請加QQ群:135430763共同學習! }}
Center.java
package com.test;import java.util.Random;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.TimeUnit;/** * @see 服務中心 * @author Herman.Xiong * @date 2014年11月17日 14:41:28 * @version V1.0 */public class Center extends Thread { private final static int MAXCOUNT = 10; private BlockingQueue<Waiter> waiters; private BlockingQueue<Customer> customers; private Random rand = new Random(47); private final static int PRODUCERSLEEPSEED = 100; private final static int CONSUMERSLEEPSEED = 10000; public Center() { //建立10名提供服務的工作人員 this.waiters = new LinkedBlockingQueue<Waiter>(MAXCOUNT); for (int i = 0; i < MAXCOUNT; i++) { waiters.add(new Waiter()); } //10名工作人員工作就緒,建立客戶隊列 this.customers = new LinkedBlockingQueue<Customer>(); } public void produce() { try { TimeUnit.MILLISECONDS.sleep(rand.nextInt(PRODUCERSLEEPSEED)); } catch (InterruptedException e) { e.printStackTrace(); } this.customers.add(new Customer()); } public void consume() { try { // 服務表單可用 Waiter waiter = this.waiters.take(); this.waiters.remove(waiter); // 客戶可用 Customer customer = this.customers.take(); this.customers.remove(customer); // 表單顯示 System.out.println(waiter + "正在為" + customer + "服務..."); TimeUnit.MILLISECONDS.sleep(rand.nextInt(CONSUMERSLEEPSEED)); this.waiters.add(waiter); } catch (InterruptedException e) { System.err.println("---" + e.getMessage()); } } }
Producer.java
package com.test;/** * @see 生產者線程,類比銀行工作人員服務完畢一位客戶後開始準備服務下一位客戶 * @author Herman.Xiong * @date 2014年11月17日 14:55:43 * @version V1.0 */public class Producer implements Runnable { private Center center; public Producer(Center center) { this.center = center; } @Override public void run() { while (!Thread.interrupted()) { //產生客戶 center.produce(); } } }
Consumer.java
package com.test;/** * @see 類比客戶完畢業務需求後,服務人員空暇就緒 * @author Herman.Xiong * @date 2014年11月17日 14:57:11 * @version V1.0 */public class Consumer implements Runnable { private Center center; public Consumer(Center center) { this.center = center; } @Override public void run() { while (!Thread.interrupted()) { center.consume(); } } }
點擊源碼下載:http://download.csdn.net/download/xmt1139057136/8167619
關於大家關注我的部落格!如有疑問,請加QQ群:135430763共同學習!
叫號系統排隊系統挂號系統實現(JAVA隊列)