私はプロジェクトに取り組んでいて、何が最善かわからないいくつかの問題に遭遇しました。私がやりたいのは、4つのキューを実行することです。各キューには優先順位があり、各キューはラウンドロビン形式で所定の時間実行され、Javaapiで見つけた各キューに優先キューを使用することを考えていました。リンクリストは、FIFOキューであるキュー(その権利を読んでいる場合)でもあります。プロジェクトの主な目標は、「プロセス」を取得して優先順位を割り当て、このプロセスをキューの1つで実行してから、優先順位を再設定し、キューを変更するか、そのままにしておくことです。
リンクリストと優先キューのどちらがより良いアプローチでしょうか?これに関するご意見ありがとうございます
2 に答える
JavaコレクションライブラリのLinkedListをいつでも実装し、いくつかのメソッドを微調整して優先キューに変えることができます。バム-両方の長所。
プロジェクトに合わせて変更する方法は、add()
メソッドをオーバーロードして優先度パラメーターを含めることです。キューは従来FIFOですが、LinkedListにはremoveFirst()
とremoveLast()
関数があります(「削除」- remove(int index)
)。つまり、ライブラリクラスで必要なすべてのツールが揃っています。これは学校のプロジェクト用だと思いますので、OOPの継承についての理解を示す良い方法でもあります。
int priority
もう1つの方法は、プロパティで定義する「Process」クラスの「LinkedList」を作成することです。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;
}
}
}
終わり。スレッド、スイッチングキューなどに特別な優先順位はありません。それは1つのキューであり、多くの消費者が、次のことを簡単につかんで実行できます。あなたが説明したものよりもおそらくうまく機能する(つまり、よりスループットが高い)はるかに単純なアーキテクチャ。
一方、LinkedListにはキューに入れるためのメソッドがありますが、それを優先キューに変えるには、優先キューにするためのメソッドを自分で追加する必要があります(つまり、ソートされた順序で物を追加します)。
優先度の異なるスレッドで4つの別々のキューを使用する必要がある場合、それは残念なアーキテクチャですが、それは可能です。その場合、優先キューとリンクリストの違いはゼロだと思います。異なる優先度の優先度キューには何も入っていないからです。これは単なるリンクリストです。4つのリストのアプローチを維持する必要がある場合は、それぞれが優先順位などを表します。4つのリストを所有する単純なクラスを作成すると、コンシューマースレッドにそのクラスへの参照が含まれます。次に、単純なtake()メソッドを実装します。そして、最も優先度の高いジョブをプルして、そのスレッドに戻します。そうすれば、スレッドは優先度について知る必要がなく、実際に任意のキューからプルできます。より簡単に、