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