2012-10-23 54 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

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