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

在java中使用队列的最佳方法,java,linked-list,priority-queue,Java,Linked List,Priority Queue,我正在做一个项目,遇到了一些问题,我不知道什么是最好的。我想做的是让4个队列运行,每个队列都有一个优先级,因此每个队列都以循环的形式运行预定的时间量,并考虑对每个队列使用优先级队列,然后我在Java api中发现,链表也是一个队列(如果我读得正确的话),它是一个FIFO队列。 该项目的主要目标是获取一个“流程”,然后为其分配优先级,并让该流程在其中一个队列中运行,然后重新确定其优先级,或者更改其队列,或者将其保留在原来的位置。 使用链表或优先级队列哪个方法更好? 感谢您在此上的任何输入,您始终可

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

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

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


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

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

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


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

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

您有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;
      }
   }
}
公共类作业实现可比较的{
公共枚举优先级{低、中、高、最高};
私人T载荷;
私人优先权;
公共作业(T有效负载,优先级){…}
public T getPayload(){return payload;}
公共优先级getPriority(){return Priority;}
公共int比较(该作业){
if(this.priority.ordinal()that.priority.ordinal()){
返回-1;
}否则{
返回0;
}
}
}
完成了。在线程、交换队列等方面没有特别的优先级。这是一个队列,许多消费者,很容易抓住下一个东西就走。比您描述的更简单的架构可能会更好地工作(即更全面)

另一方面,LinkedList有用于排队的方法,但将其转换为优先级队列需要您自己添加使其成为优先级队列的方法(即按排序顺序添加内容)


如果您必须使用4个具有不同优先级线程的独立队列,这只是一种不幸的架构,但您可以这样做。我认为在这种情况下,优先级队列和链表之间的差异为零。因为在不同优先级的优先级队列中永远不会有任何东西。那只是一个链表。如果你必须保持4个列表的方法,其中每个列表代表优先级或其他。我将编写一个拥有四个列表的简单类,消费者线程将有一个对它的引用。然后在其上实现一个简单的take()方法。它将提取优先级最高的作业并将其返回到该线程。这样,您的线程就不必知道优先级,并且可以真正从任何队列中提取。更简单,但我还是会像我描述的那样使用PriorityQueue,放弃整个4队列的想法。

你的问题有很多语法错误