我有多个BlockingQueues包含要发送的消息.队列的消费者是否有可能减少?我不想循环队列并继续轮询他们(忙等待),我不想要每个队列的线程.相反,我想有一个线程在任何队列上有消息可用时被唤醒.
解决方法
你可以做的一个技巧是排队队列.所以你会做的是一个单个的阻止队列,所有的线程订阅.然后当您将某些内容排入某个BlockingQueue时,您也会将此阻塞队列排入队列.所以你会有这样的东西:
BlockingQueue<WorkItem> producers[] = new BlockingQueue<WorkItem>[NUM_PRODUCERS]; BlockingQueue<BlockingQueue<WorkItem>> producerProducer = new BlockingQueue<BlockingQueue<WorkItem>>();
然后当你得到一个新的工作项目:
void addWorkItem(int queueIndex,WorkItem workItem) { assert queueIndex >= 0 && queueIndex < NUM_PRODUCERS : "Pick a valid number"; //Note: You may want to make the two operations a single atomic operation producers[queueIndex].add(workItem); producerProducer.add(producers[queueIndex]); }
现在你的消费者都可以阻挡在生产者生产者上.我不知道这个策略是多么有价值,但它完成了你想要的.