同时执行2个任务列表

时间:2012-10-23 12:11:02

标签: java multithreading concurrency sms producer-consumer

基本上我正在构建一个SMS应用程序,它从数据库中读取待处理的SMS消息,然后将它们全部发送出去。有两种类型的短信; 正常消息可以随时发送,紧急消息必须在任何正常消息之前发送。我在应用程序中使用多线程。

我想拥有2个任务队列;一个用于正常消息,一个用于紧急消息。然后池中的线程将执行两个队列中的任务,考虑到正常消息中没有SMS消息可以发送,除非没有紧急消息

实施如下:

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来完成吗?

1 个答案:

答案 0 :(得分:2)

您可以使用两个ConcurrentQueues,一个Hi-Pri和一个Lo-Pri以及一个信号量。

将SMS消息对象推送到其中一个队列,向信号灯发出信号。

在短信发送线程中,等待信号量。收到信号后,首先检查Hi-Pri队列计数。如果有对象,请获取并发送。如果没有,则从Lo-Pri队列中获取消息(因为肯定会有一个),然后发送它。然后循环再次等待信号量。