我有一个 PriorityBlockingQueue
,我在其中添加了 SocketHolder
,如下所示。假设当前运行此代码的数据中心是 abc
。我们有三个数据中心 abc
、def
和 pqr
。
private static final PriorityBlockingQueue<SocketHolder> liveQueue = new PriorityBlockingQueue<>();
for (SocketHolder socket : listOfSockets) {
liveQueue.add(socket);
}
现在我需要做的是:
- 我必须在
liveQueue
上设置某种排序,以便所有数据中心为abc
的SocketHolder
(这是代码所在的当前数据中心正在运行),它们应该在顶部,这意味着当我们从这个liveQueue
检索它时,所有带有abc
数据中心的SocketHolder
应该首先出来然后在所有其他SocketHolder
与其他 dc 上。对于当前数据中心是pqr
或def
的情况也是如此。
下面是我的 SocketHolder
类,它实现了 Comparable 接口(interface),但我混淆了我在 compareTo
方法中需要做的事情,所以在 liveQueue< 的顶部
(在向其添加元素之后)我们拥有所有 SocketHolder
,其数据中心是当前数据中心,然后是我没有优先级的其他数据中心。
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;
}
}
最佳答案
实时数据中心将被分配优先级 1,其他数据中心优先级为 2。队列将首先处理最低优先级。
public final class SocketHolder implements Comparable<SocketHolder> {
private final Socket socket;
private final Datacenter dc;
private final Context context;
private final int priority;
public SocketHolder(Socket socket, Datacenter dc, Context context) {
super();
this.socket = socket;
this.dc = dc;
this.context = context;
this.priority = this.dc.getName().equals(Utils.CURRENT_DATACENTER.get().name()) ? 1 : 2;
}
@Override
public int compareTo(SocketHolder o) {
return Integer.compare(this.priority, o.priority);
}
}
关于java - 在优先级阻塞队列中设置顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49203619/