【发布时间】:2021-06-07 00:00:43
【问题描述】:
我正在接收一系列消息,我想按顺序处理它们。每条消息都有一个序列号。有一个线程池接收它们。我想将它们放入像PriorityBlockingQueue 这样的阻塞队列中,并以正确的顺序读取它们,阻塞直到下一条连续消息可用。
例如给定这段代码:
ConsecutiveBlockingQueue<Integer> q = new ConsecutiveBlockingQueue<>();
new Thread (()->{ q.put(0); q.put(2); }).start();
new Thread (()->{ q.put(1); q.put(3); }).start();
ArrayList<Integer> ordered = new ArrayList<>(4);
for (int i = 0; i < 4; i++) {
ordered.add(q.take());
}
System.out.println(ordered);
我希望它打印 [0, 1, 2, 3]
【问题讨论】:
-
是的,
PriorityBlockingQueue就是这样做的。你的问题? -
@user207421 这不是 PriorityBlockingQueue 所做的。 PriorityBlockingQueue 仅在为空或已满时阻塞。我需要一个队列,该队列在 0 和 1 被占用后也会阻塞,其中有 3 个,但缺少 2 个。如果在我的示例中将 Tread.sleep 添加到 t2,您将看到结果不会是 [0, 1, 2, 3]
-
据我所知,JDK 中没有任何东西可以满足您的需求。不过那里可能有一个图书馆。然而,当涉及到它时,自己实现它应该不会太难。如果您只想要基本行为,至少不会。你甚至可以在内部使用
PriorityQueue。
标签: java algorithm concurrency priority-queue java.util.concurrent