2012-10-23 52 views
1

基本上我構建了一個SMS應用程序,它從數據庫中讀取掛起的SMS消息,然後將它們全部發送出去。有兩種類型的SMS消息; 正常消息可以隨時發送,緊急消息必須在任何正常消息之前發送。我正在應用程序中使用多線程。同時執行2個任務列表

我想有2隊任務;一個用於正常消息,一個用於緊急消息。然後,在池中的線​​程會從兩個隊列,除非有沒有緊急消息執行任務,考慮到從正常郵件沒有SMS mesages可以發送帳戶。

的實施將東西如下:

public class SMSApplication 
{ 
    private Queue<SMSTask> normalMessages = new Queue<SMSTask>(); // not necessarily java.util.Queue 
    private Queue<SMSTask> urgentMessages = new Queue<SMSTask>(); 

    // ... 

    public void addNormalMessage(SMSTask task) 
    { 
     normalMessages.add(task); 
    } 

    public void addUrgentMessage(SMSTask task) 
    { 
     urgentMessages.add(task); 
    } 

    public void runApplication() 
    { 
     /* iterate over the queues, create new threads or select existing ones from a pool, and then execute the tasks */ 
    } 
} 

什麼是實現這一目標的最佳途徑?我可以用BlockingQueue完成嗎?

+0

要在兩端刻錄它,可能是BlockingDeque? http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingDeque.html?副作用是LIFO頭部;也許你對此很好。 –

+0

...哎呀,錯誤的網址;意思是:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html –

+0

@ full.stack.ex謝謝!我會看看['PriorityBlockingQueue'](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html)。 –

回答

2

你可以用兩個ConcurrentQueues,一個Hi-Pri,一個Lo-Pri和一個信號量來完成。

將SMS消息對象推入其中一個隊列,發出信號燈信號。

在您的短信發送線程中,等待信號量。收到信號時,請先檢查Hi-Pri隊列計數。如果有一個對象,獲取併發送它。如果沒有,從Lo-Pri隊列中獲取消息(確定爲一個消息),然後發送。然後循環等待信號量。

+0

+1感謝您的回答。雖然你的回答是正確的,但我使用['LinkedBlockingDeque'](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingDeque.html),它消除了需要兩個隊列和信號燈的需求:) –

+0

好吧,你有它的工作:)) –