В настоящее время у меня есть две очереди и предметы, перемещающиеся между ними. Первоначально элемент попадает в 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).
Интересно, есть ли хорошее решение, обобщаемое для нескольких очередей?



