0

我正在做一个项目,遇到了一些我不知道什么是最好的问题。我想要做的是运行 4 个队列,每个队列都有一个优先级,因此每个队列都以循环格式运行其预定的时间量,并且正在考虑为每个队列使用优先级队列,然后我在 Java api 中找到一个链表也是一个队列(如果我读的是正确的),它是一个 FIFO 队列。该项目的主要目标是采用一个“进程”,然后为其分配优先级,让该进程在其中一个队列中运行,然后重新设置其优先级,或者将队列更改为原位或将其保留在原处。
链接列表或优先级队列哪个更好?感谢您对此的任何意见

4

2 回答 2

2

您始终可以实现 Java 集合库的 LinkedList 并调整一些方法以将其转换为优先级队列。Bam——两全其美。

修改它以适合您的项目的一种方法是重载该add()方法以包含优先级参数。虽然队列传统上是 FIFO,但 LinkedList 有一个removeFirst()和一个removeLast()功能(甚至是“删除”-- remove(int index))。因此,您拥有库类所需的所有工具。我假设这是一个学校项目,所以这也是展示对 OOP 继承的理解的好方法。

int priority另一种方法是只使用您将使用属性定义的“进程”类的“LinkedList” 。这样,您可以拥有某种流程管理器,通过查看每个对象的priority属性来操作 Process 对象的 LinkedList。

于 2012-10-18T18:22:09.123 回答
1

你的问题有很多语法错误,很难阅读,所以我不知道我是否完全理解你的问题,但让我们试试。

您有 4 个队列,代表 4 个不同的优先级(?)。因此,必须有 1+ 个生产者线程根据优先级将作业放入每个队列(这真的不清楚,所以我猜这就是您的意思),并且有 1+ 个消费者线程为每个队列提供服务有自己的优先级的队列。优先级为 1 的消费者线程从队列 1 中提取,优先级为 2 的从队列 2 中提取,等等(同样没有真正解释,但我在这里推断)。你想知道这些队列应该是优先队列还是链表。

好吧,如果您使用优先级队列,则队列会根据添加到其中的作业的优先级对自身进行排序。Java 实现它的方式只不过是一个排序列表。因此,优先级较高的作业将在队列中优先于较低优先级的作业。通过使用优先级队列,不需要多个队列,甚至不需要具有优先级的线程。您只需使用优先级队列,它将按优先级顺序添加作业。具有较高优先级的作业将被推进并在较低优先级的作业之前完成。

这在 javadoc 中并不明显,但您可以创建一个像这样的通用作业并将其添加到优先级队列中以使其工作:

public class Job<T> implements Comparable<Job<T>> {

   public enum Priority { LOW, MEDIUM, HIGH, HIGHEST };

   private T payload;

   private Priority priority;

   public Job( T payload, Priority priority ) { .... }

   public T getPayload() { return payload; }

   public Priority getPriority() { return priority; }

   public int compareTo( Job<T> that ) {
      if( this.priority.ordinal() < that.priority.ordinal() ) {
         return 1;
      } else if( this.priority.ordinal() > that.priority.ordinal() ) {
         return -1;
      } else {
         return 0;
      }
   }
}

完毕。在线程、切换队列或其他方面没有花哨的优先级。这是一个队列,许多消费者,很容易抓住下一件事然后走。比您描述的更简单的架构可能会更好地工作(即更多的吞吐量)。

另一方面,LinkedList 具有排队的方法,但是将其转换为优先级队列需要您自己添加方法以使其成为优先级队列(即按排序顺序添加事物)。

如果您必须很好地使用具有不同优先级线程的 4 个独立队列,那只是不幸的架构,但您可以这样做。我认为在这种情况下,优先级队列和链表之间的差异为零。因为您永远不会在不同优先级的优先级队列中拥有任何东西。那只是一个链表。如果您必须保留 4 个列表的方法,每个列表都代表优先级或其他。我会编写一个拥有四个列表的简单类,并且消费者线程将引用它。然后在其上实现一个简单的 take() 方法。它会拉出最高优先级的工作并将其返回给该线程。这样,您的线程就不必知道优先级,并且可以真正从任何队列中拉出。更轻松,

于 2012-10-18T18:29:56.680 回答