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).
我想知道是否有一个很好的解决方案可以推广到多个队列?
用逻辑包装队列来管理项目状态是否有意义?
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需要同步,但这无论如何都是一个问题。