在java中使用队列的最佳方法

时间:2012-10-18 18:20:02

标签: java linked-list priority-queue

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

的任何意见

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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()方法。它会将最高优先级的工作拉回到该线程。这样你的线程就不必了解优先级,并且可以真正从任何队列中拉出来。更简单,但我仍然会像我描述的那样使用PriorityQueue并抛弃整个4队列的想法。

相关问题