跟踪地图中队列之间的进度

maa*_*nus 12 java queue concurrency concurrenthashmap

我目前有两个队列和物品在他们之间旅行.最初,一个项目被放入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);
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但它很丑陋并且留下了状态不一致的时间窗口.这种不一致并不是什么大不了的事情,它可以通过同步来解决,但这可能适得其反,因为队列的容量有限,可能会阻塞.丑陋使我​​更加困扰.

效率几乎不重要,因为处理需要几秒钟.专用线程用于控制并发.任何项目都不应该处于多个状态(但这不是非常重要,并且不能通过我目前的流行方法保证).会有更多的队列(和状态),它们会有不同的种类(DelayQueue,ArrayBlockingQueue也许PriorityQueue).

我想知道是否有一个很好的解决方案可以推广到多个队列?

Dav*_*idW 3

用逻辑包装队列来管理项目状态是否有意义?

public class QueueWrapper<E> implements BlockingQueue<E> {
    private Queue<E> myQueue = new LinkedBlockingQueue<>();
    private Map<E, Status> statusMap;

    public QueueWrapper(Map<E, Status> statusMap) {
        this.statusMap = statusMap;
    }

    [...]
    @Override
    public E take() throws InterruptedException {
        E result = myQueue.take();
        statusMap.put(result, Status.AFTER_FIRST);
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

这样状态管理总是与队列操作相关(并包含在队列操作中)......

显然statusMap需要同步,但这无论如何都是一个问题。