叫號系統排隊系統掛號系統實現(JAVA佇列)

業餘草發表於2014-11-17

關於佇列,使用的地方非常的多。現實中有很多的例子。比如醫院的掛號系統,銀行裡的叫號系統,食堂裡的排隊打飯等等。市場上又這樣的排隊取號的裝置。他們的功能基本如下:

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共同學習!

相關文章