簡體   English   中英

在Java中使用隊列的最佳方法

[英]Best way to use a queue in java

我當時正在做一個項目,遇到了一些我不知道最好的問題。 我想做的是讓4個隊列運行,每個隊列都有一個優先級,因此每個隊列都以循環格式運行預定的時間,並考慮為每個隊列使用Priority Queue,然后我在Java api中找到了鏈表也是一個隊列(如果我讀對了),它是一個FIFO隊列。 該項目的主要目標是采用一個“進程”,然后為其分配優先級,然后讓該進程在一個隊列中運行,然后重新設置其優先級,然后更改其隊列或將其保留在原處。
哪種方法比鏈表或優先級隊列更好? 感謝您對此的任何投入

您始終可以實現Java集合庫的LinkedList,並調整一些方法將其轉換為優先級隊列。 Bam-兩全其美。

修改它以適合您的項目的一種方法是重載add()方法以包含優先級參數。 盡管隊列傳統上是FIFO,但LinkedList具有removeFirst()removeLast()函數(甚至是“ remove at” remove(int index) )。 因此,您擁有庫類所需的所有工具。 我認為這是針對學校項目的,因此這也是展示對OOP繼承的一種好方法。

另一種方法是僅具有“ Process”類的“ LinkedList”,您將使用int priority屬性對其進行定義。 這樣,您可以擁有某種流程管理器,該處理程序將通過查看每個對象的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;
      }
   }
}

做完了 在線程,切換隊列或其他方面沒有花哨的優先級。 這是一個隊列,很多消費者,只需輕松抓住下一個東西就可以了。 比您所描述的要簡單得多的體系結構可能會更好地工作(即更多地通過放置)。

另一方面,LinkedList具有排隊的方法,但是將其轉換為優先級隊列將需要您自己添加使之成為優先級隊列的方法(即,按排序順序添加內容)。

如果您必須很好地使用具有不同優先級線程的4個單獨的隊列,那只是不幸的體系結構,但是您可以這樣做。 我認為在這種情況下,優先級隊列和鏈接列表之間的差為零。 因為您永遠不會在不同優先級的優先級隊列中擁有任何東西。 那只是一個鏈表。 如果您必須保留4個列表的方法,則每個方法代表優先級或其他。 我將編寫一個簡單的類,該類擁有四個列表,並且消費者線程將對其進行引用。 然后在其上實現一個簡單的take()方法。 並且它將拉出最高優先級的作業並將其返回到該線程。 這樣,您的線程就不必知道優先級,並且實際上可以從任何隊列中退出。 比較容易,但是我仍然只使用我所描述的PriorityQueue並放棄整個4隊列的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM