基本上我正在构建一个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
来完成吗?
答案 0 :(得分:2)
您可以使用两个ConcurrentQueues,一个Hi-Pri和一个Lo-Pri以及一个信号量。
将SMS消息对象推送到其中一个队列,向信号灯发出信号。
在短信发送线程中,等待信号量。收到信号后,首先检查Hi-Pri队列计数。如果有对象,请获取并发送。如果没有,则从Lo-Pri队列中获取消息(因为肯定会有一个),然后发送它。然后循环再次等待信号量。