В настоящее время у меня есть две очереди и предметы, перемещающиеся между ними. Первоначально элемент попадает в firstQueue
, затем один из трех выделенных потоков перемещает его в secondQueue
и, наконец, другой выделенный поток удаляет его. Эти шаги, очевидно, включают в себя некоторую обработку. Мне нужно получить статус любого элемента (IN_FIRST
, AFTER_FIRST
, IN_SECOND
, AFTER_SECOND
или ABSENT
), и я внедрил его вручную, выполнив обновление statusMap
где очередь изменяется, как
while (true) {
Item i = firstQueue.take();
statusMap.put(i, AFTER_FIRST);
process(i);
secondQueue.add(i);
statusMap.put(i, IN_SECOND);
}
Это работает, но оно уродливо и оставляет окно времени, где статус несовместим. Несогласованность не имеет большого значения, и она разрешима путем синхронизации, но это может иметь неприятные последствия, поскольку очередь имеет ограниченную емкость и может блокироваться. Уродство беспокоит меня больше.
Эффективность вряд ли имеет значение, так как обработка занимает секунды. Выделенные потоки используются для управления параллелизмом. Ни один элемент никогда не должен быть в нескольких штатах (но это не очень важно и не гарантируется моим текущим радикальным подходом). Будет больше очередей (и состояний), и они будут разных типов (DelayQueue
, ArrayBlockingQueue
и, возможно, PriorityQueue
).
Интересно, есть ли хорошее решение, обобщаемое для нескольких очередей?