【问题标题】:Executing 2 lists of tasks concurrently同时执行 2 个任务列表
【发布时间】:2012-10-23 21:22:09
【问题描述】:

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

我想要 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 来实现吗?

【问题讨论】:

标签: java multithreading concurrency sms producer-consumer


【解决方案1】:

您可以使用两个 ConcurrentQueue,一个 Hi-Pri,一个 Lo-Pri 和一个信号量来完成。

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

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

【讨论】:

  • +1 感谢您的回答。虽然您的回答是正确的,但我使用了LinkedBlockingDeque,它消除了拥有两个队列和信号量的需要:)
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多