ここ数日、優先キューの実装に取り組んできました。スレッドの安全性を考慮する必要があるため、PriorityQueue は適用できません。非常に簡単な実装方法は、優先度の高いものを 1 つのキューに挿入し、優先度の低いものを別のキューに挿入することです。番号を取得するときに、最初に優先度の高いキューから番号を取得します。この欠点は、優先レベルが増えるほど、キューが増えることです。
スレッドセーフである必要があるため、キューはスレッドセーフな ConcurrentLinkedQueue を使用します。API ドキュメントには、ConcurrentLinkedQueue は効果的な「待機なし」アルゴリズムを使用するため、スループットが非常に優れていると記載されています。
簡単なコードは次のとおりです。
パッケージテスト。
インポート java.util.concurrent.ConcurrentLinkedQueue;
パブリック クラス PriorityQueueTest {
public static void main(String[] args) {
ConcurrentLinkedQueue <String> highPriority = new ConcurrentLinkedQueue <String>(); //高優先度
ConcurrentLinkedQueue <String> lowPriority = new ConcurrentLinkedQueue <String>(); // 優先度が低い
highPriority.add( "aaa" );
highPriority.add( "bbb" );
highPriority.add( "111" );
lowPriority.add( "ccc" );
lowPriority.add( "ddd" );
lowPriority.add( "222" );
int i = 0 、j = 0 、k = 0 ;
while(true){
while(true){
if (!highPriority.isEmpty()){
System.out.print(highPriority.remove());
i++;
k++;
System.out.println( ", i = " +i+ ", k=" +k);
壊す ;
}
if (!lowPriority.isEmpty()){
System.out.print(lowPriority.remove());
j++;
k++;
System.out.println( ", j = " +j+ ", k=" +k);
壊す ;
}
壊す ;
}
試す {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
もう 1 つの方法は、PriorityQueue を継承して Comparable インターフェイスを実装し、compareTo メソッドを自分で書き換えることによって、非常に強力な優先キューを実装することです。ただし、欠点はスレッドセーフではないことです。
コードは次のとおりです。
パッケージテスト。
インポートjava.util.PriorityQueue;
public class PriorityTest extends PriorityQueue<PriorityTest.Test>{
静的クラス Test は Comparable<Test>{ を実装します
文字列パケット。
強い誇り。
public Test(文字列パケット、intプライド) {
この .packet = パケット;
この .priotity = 優先度;
}
public int CompareTo(テスト引数) {
if (優先度 < 引数.優先度)
1を返します。
else if (優先度 > arg.priotity)
戻り値 - 1 ;
それ以外
0を返します。
}
public String toString(){
返送パケット。
}
}
public void add(String str, int priority){
super .add( new Test(str,priority));
}
public static void main(String args[]){
PriorityTest pTest = new PriorityTest();
pTest.add( "aaa" , 3 ); // 最も高い優先度
pTest.add( "bbb" , 2 );
pTest.add( "ccc" , 1 );
while (!pTest.isEmpty()){
System.out.println(pTest.remove());
}
}