【问题标题】:setup ordering in priority blocking queue在优先阻塞队列中设置排序
【发布时间】:2018-03-09 23:20:58
【问题描述】:

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

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

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

现在我需要做的是:

  • 我必须在liveQueue 上设置某种排序,以便所有SocketHolder 的数据中心为abc(这是当前运行代码的数据中心),它们应该位于顶部,这意味着当我们从这个liveQueue 中检索它,所有SocketHolderabc 数据中心应该首先出现,然后在所有其他SocketHolder 和其他dc 上。对于当前数据中心为 pqrdef 的情况也是如此。

下面是我的 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


【解决方案1】:

实时数据中心将被分配优先级 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);
   }
}

【讨论】:

  • 为什么我们不能在我们已经知道的当前数据中心和我们正在为其添加SocketHolder 的数据中心的基础上为每个 dc 分配一个编号?
  • 我的意思是检查当前的数据中心(代码已经在我的 compareTo 方法中,但它已被注释)与我们正在添加的 SocketHolder 的数据中心并在此基础上进行排序?这行不通吗?
  • 是 - SocketHolder 对象如何知道哪个是当前数据中心?
  • 只需拨打此电话 String currentDC = Utils.CURRENT_DATACENTER.get().name(); 这将告诉当前运行代码的数据中心是什么,以便我们可以使用它并进行比较,这就是我在我的问题中提到的。
  • 我不知道获取 DC 名称的方法...假设它是 getName()
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2014-10-16
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多