В настоящее время у меня есть параллельная реализация очереди, которая использует BlockingQueue
в качестве хранилища данных. Теперь мне нужно представить объект второго типа с более высоким приоритетом, что приведет меня к очереди с голоданием / приоритетом для исходной очереди. Итак, мы работаем с объектами типа A и типа B, которые создаются из нескольких потоков. Любые объекты типа B должны быть обработаны до объектов типа A, но ДОЛЖНО поддерживаться, кроме этого порядка FIFO. Поэтому, если {1A, 1B, 2A, 3A, 2B} вставлены, порядок должен быть {1B, 2B, 1A, 2A, 3A}
Я пытался одним PriorityBlockingQueue
выдвинуть тип B вперед, но я не смог выполнить требование FIFO (нет естественного порядка между элементами одного типа).
Моя следующая мысль - использовать две параллельные очереди. Я ищу общие ошибки или соображения при координации доступа между двумя очередями. В идеале я бы хотел сделать что-то вроде этого:
public void add(A a)
{
aQueue.add(a);
}
public void add(B b)
{
bQueue.add(b);
}
private void consume()
{
if(!bQueue.isEmpty())
process(bQueue.poll());
else if(!aQueue.isEmpty())
process(aQueue.poll());
}
Нужна ли мне какая-либо синхронизация или блокировки, если обе очереди ConcurrentLinkedQueue
(или вставить более подходящую структуру здесь)? Примечание. У меня много производителей, но только один потребитель (однопоточный ThreadPoolExecutor
).
РЕДАКТИРОВАТЬ: Если после проверки isEmpty () входит B, то нормально обрабатывать A и обрабатывать его при следующем вызове потребление ().