Java 优先级阻塞队列中的设置顺序

Java 优先级阻塞队列中的设置顺序,java,algorithm,priority-queue,comparable,blockingqueue,Java,Algorithm,Priority Queue,Comparable,Blockingqueue,我有一个PriorityBlockingQueue,我正在其中添加SocketHolder,如下所示。假设运行此代码的当前数据中心是abc。我们有三个数据中心abc,def和pqr private static final PriorityBlockingQueue<SocketHolder> liveQueue = new PriorityBlockingQueue<>(); for (SocketHolder socket : listOfSockets) {

我有一个
PriorityBlockingQueue
,我正在其中添加
SocketHolder
,如下所示。假设运行此代码的当前数据中心是
abc
。我们有三个数据中心
abc
def
pqr

private static final PriorityBlockingQueue<SocketHolder> liveQueue = new PriorityBlockingQueue<>();

for (SocketHolder socket : listOfSockets) {
    liveQueue.add(socket);
}

实时数据中心的优先级为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);
   }
}
public final类SocketHolder实现了可比较的{
专用终端插座;
专用最终数据中心dc;
私人最终语境;
私有最终int优先级;
公共SocketHolder(套接字、数据中心dc、上下文){
超级();
this.socket=socket;
this.dc=dc;
this.context=上下文;
this.priority=this.dc.getName().equals(Utils.CURRENT_DATACENTER.get().name())?1:2;
}
@凌驾
公共内部比较(SocketHolder o){
返回整数。比较(this.priority,o.priority);
}
}

与其给每个dc一个数字,为什么我们不能根据我们已经知道的当前数据中心和我们正在添加的
SocketHolder
的数据中心进行此操作?我的意思是只需检查当前数据中心(代码已经在我的compareTo方法中,但它已被注释)我们正在添加SocketHolder数据中心,并在此基础上进行订购?这不起作用吗?是的-SocketHolder对象如何知道哪个是当前数据中心?只需调用
String currentDC=Utils.current\u datacenter.get().name()这将告诉我们当前运行代码的数据中心是什么,以便我们可以使用它并进行比较,这就是我提到的我相信我的问题。我不知道获取DC名称的方法。。。假设它是getName(),我只需要为当前数据中心使用一个不同的队列,然后首先处理它。PQ在这方面做得太过火了,因为基本上只有两个优先级:“this”和“other”。PQ的优点是,如果提交了“late”任务,它将立即冒泡到顶部。@IanMc仅在您不智能地处理队列,或者有两个以上的优先级的情况下。您应该首先从第一个队列中取出,如果为空,则从第二个队列中取出一项:冲洗并重复。如果只有两个优先级,PQ也将失去插入顺序。
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);
   }
}