摘要
我有一个消费者,多个生产者问题,每个生产者将其数据放在一个单独的队列上(因为他们的数据类型不同),并且生产者都在他们自己的线程上。
消费者在循环中将根据优先级从生产者队列中提取项目,然后当所有队列都为空时,它应该进入休眠状态,直到生成更多数据。
我不知道最好的(无错误和最快)的方式让消费者睡觉然后唤醒它。
当前代码
目前我正在使用一个简单的信号量。每次生成新数据时,生产者都会调用:
void produce(Data data) {
queue.add(data);
semaphore.release();
}
消费者:
while (!Thread.currentThread().isInterrupted()) {
consumeQueues();
semaphore.tryAcquire(time, TimeUnit.SECONDS);
semaphore.drainPermits();
}
当前的想法
使用空selector
,让消费者致电selector.select()
,制作人致电selector.wakeup()
。
重写所有生成的值并切换到优先级队列。会有很多工作,我甚至不确定我能在不失速度的情况下获得与现在完全相同的行为。
使用lock
/ conditional
方法并致电conditional.await()
和conditional.signal()
。我担心添加大量代码并通过增加的锁定获取(性能敏感代码)来降低速度。
最好我只使用static AtomicBoolean
,当数据可用时,生产者可以懒洋洋地设置为true,但AtomicBoolean
没有block-until-true方法。
答案 0 :(得分:-1)
您可以使用以下结构:阻塞队列的优先级队列(如果同一类型中存在优先级,则为优先级队列)
你shuld做一个像ProducedItem这样的空接口,所有创建的项都应该实现,所以它会编译。
PriorityBlockingQueue<PriorityBlockingQueue<ProducedItem>> queue = new PriorityBlockingQueue<PriorityBlockingQueue<ProducedItem>>;
然后当你得到一个新的生产项目时:
void addWorkItem(int queueIndex, ProducedItem producedItem) {
//Note: You may want to make the two operations an atomic operation
priorityQueues[queueIndex].add(workItem);
prioritypriorityQueue.add(producers[queueIndex]);
}