【发布时间】:2018-03-09 23:20:58
【问题描述】:
我有一个PriorityBlockingQueue,我在其中添加SocketHolder,如下所示。假设当前运行此代码的数据中心是abc。我们有三个数据中心abc、def 和pqr。
private static final PriorityBlockingQueue<SocketHolder> liveQueue = new PriorityBlockingQueue<>();
for (SocketHolder socket : listOfSockets) {
liveQueue.add(socket);
}
现在我需要做的是:
- 我必须在
liveQueue上设置某种排序,以便所有SocketHolder的数据中心为abc(这是当前运行代码的数据中心),它们应该位于顶部,这意味着当我们从这个liveQueue中检索它,所有SocketHolder和abc数据中心应该首先出现,然后在所有其他SocketHolder和其他dc 上。对于当前数据中心为pqr或def的情况也是如此。
下面是我的 SocketHolder 类,它实现了 Comparable 接口,但我很困惑我需要在我的 compareTo 方法中做什么,所以在 liveQueue 的顶部(在向它添加元素之后)我们拥有所有 @987654340 @ 其数据中心是当前数据中心,然后是我没有优先权的其他数据中心。
public final class SocketHolder implements Comparable<SocketHolder> {
private final Socket socket;
private final Datacenter dc;
private final Context context;
public SocketHolder(Socket socket, Datacenter dc, Context context) {
super();
this.socket = socket;
this.dc = dc;
this.context = context;
}
@Override
public int compareTo(SocketHolder o) {
// String currentDC = Utils.CURRENT_DATACENTER.get().name();
return 0;
}
}
【问题讨论】:
-
我会为当前数据中心使用不同的队列并首先处理它。 PQ 对此有点过分了,因为似乎基本上只有两个优先级:“这个”和“其他”。
-
PQ 的优势在于,如果提交了“迟到”的任务,它会立即冒泡到顶部。
-
@IanMc 仅当您不智能地处理队列或有两个以上优先级时。您应该首先从第一个队列中取出,如果为空,则从第二个队列中取出 一个 项:冲洗并重复。如果只有两个优先级,PQ 也会丢失插入顺序。
标签: java algorithm priority-queue comparable blockingqueue