如何等待多个阻塞队列?

时间:2016-12-23 20:34:33

标签: java multithreading signals

摘要

我有一个消费者,多个生产者问题,每个生产者将其数据放在一个单独的队列上(因为他们的数据类型不同),并且生产者都在他们自己的线程上。

消费者在循环中将根据优先级从生产者队列中提取项目,然后当所有队列都为空时,它应该进入休眠状态,直到生成更多数据。

我不知道最好的(无错误和最快)的方式让消费者睡觉然后唤醒它。

当前代码

目前我正在使用一个简单的信号量。每次生成新数据时,生产者都会调用:

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方法。

1 个答案:

答案 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]);
}