0

私はプロジェクトに取り組んでいて、何が最善かわからないいくつかの問題に遭遇しました。私がやりたいのは、4つのキューを実行することです。各キューには優先順位があり、各キューはラウンドロビン形式で所定の時間実行され、Javaapiで見つけた各キューに優先キューを使用することを考えていました。リンクリストは、FIFOキューであるキュー(その権利を読んでいる場合)でもあります。プロジェクトの主な目標は、「プロセス」を取得して優先順位を割り当て、このプロセスをキューの1つで実行してから、優先順位を再設定し、キューを変更するか、そのままにしておくことです。
リンクリストと優先キューのどちらがより良いアプローチでしょうか?これに関するご意見ありがとうございます

4

2 に答える 2

2

JavaコレクションライブラリのLinkedListをいつでも実装し、いくつかのメソッドを微調整して優先キューに変えることができます。バム-両方の長所。

プロジェクトに合わせて変更する方法は、add()メソッドをオーバーロードして優先度パラメーターを含めることです。キューは従来FIFOですが、LinkedListにはremoveFirst()removeLast()関数があります(「削除」- remove(int index))。つまり、ライブラリクラスで必要なすべてのツールが揃っています。これは学校のプロジェクト用だと思いますので、OOPの継承についての理解を示す良い方法でもあります。

int priorityもう1つの方法は、プロパティで定義する「Process」クラスの「LinkedList」を作成することです。priorityこのようにして、各オブジェクトのプロパティをピアリングすることにより、プロセスオブジェクトの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;
      }
   }
}

終わり。スレッド、スイッチングキューなどに特別な優先順位はありません。それは1つのキューであり、多くの消費者が、次のことを簡単につかんで実行できます。あなたが説明したものよりもおそらくうまく機能する(つまり、よりスループットが高い)はるかに単純なアーキテクチャ。

一方、LinkedListにはキューに入れるためのメソッドがありますが、それを優先キューに変えるには、優先キューにするためのメソッドを自分で追加する必要があります(つまり、ソートされた順序で物を追加します)。

優先度の異なるスレッドで4つの別々のキューを使用する必要がある場合、それは残念なアーキテクチャですが、それは可能です。その場合、優先キューとリンクリストの違いはゼロだと思います。異なる優先度の優先度キューには何も入っていないからです。これは単なるリンクリストです。4つのリストのアプローチを維持する必要がある場合は、それぞれが優先順位などを表します。4つのリストを所有する単純なクラスを作成すると、コンシューマースレッドにそのクラスへの参照が含まれます。次に、単純なtake()メソッドを実装します。そして、最も優先度の高いジョブをプルして、そのスレッドに戻します。そうすれば、スレッドは優先度について知る必要がなく、実際に任意のキューからプルできます。より簡単に、

于 2012-10-18T18:29:56.680 に答える