關於隊列,使用的地方很的多。
現實中有許多的樣例。
比方醫院的掛號系統,銀行里的叫號系統,食堂里的排隊打飯等等。市場上又這種排隊取號的設備。他們的功能基本例如以下:
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共同學習!