В последние несколько дней я работал над реализацией приоритетных очередей. Поскольку необходимо учитывать потокобезопасность, PriorityQueue неприменим. Очень простой метод реализации — вставить номера с более высоким приоритетом в одну очередь, а номера с более низким приоритетом — в другую очередь. При получении номеров сначала извлекайте номера из очереди с более высоким приоритетом. Недостаток этого подхода в том, что чем больше уровней приоритета, тем больше очередей.
Поскольку очередь должна быть потокобезопасной, очередь использует 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("ааа");
highPriority.add("bbb");
highPriority.add("111");
lowPriority.add("ccc");
lowPriority.add("ддд");
lowPriority.add("222");
интервал я знак равно 0, j знак равно 0, k = 0;
пока (правда) {
пока (правда) {
если (!highPriority.isEmpty()){
System.out.print(highPriority.remove());
я++;
к++;
System.out.println( ", i = " +i+ ", k=" +k);
перерыв ;
}
если (!lowPriority.isEmpty()){
System.out.print(lowPriority.remove());
j++;
к++;
System.out.println( ", j = " +j+ ", k=" +k);
перерыв ;
}
перерыв ;
}
пытаться {
Thread.sleep(100);
} catch (InterruptedException e) {
е.printStackTrace();
}
}
}
}
Другой способ — реализовать очень мощную очередь приоритетов, унаследовав PriorityQueue и реализовав интерфейс Comparable, а затем самостоятельно переписав метод CompareTo. Однако недостатком является то, что он не является потокобезопасным.
Код выглядит следующим образом:
тест упаковки;
импортировать java.util.PriorityQueue;
общедоступный класс PriorityTest расширяет PriorityQueue<PriorityTest.Test>{
статический класс Test реализует Comparable<Test>{
Строковый пакет;
внутренняя гордость;
public Test (String package, int Pride) {
этот .packet = пакет;
это .priotity = приоритет;
}
public int CompareTo(Test arg) {
если (приоритет < arg.priotity)
возврат 1;
иначе, если (приоритет > arg.priotity)
возврат — 1;
еще
вернуть 0;
}
публичная строка toString(){
возвратный пакет;
}
}
public void add(String str, int Priority){
super .add(новый тест(str,priority));
}
public static void main(String args[]){
PriorityTest pTest = новый PriorityTest();
pTest.add( "aaa" , 3 ); //Высший приоритет
pTest.add("bbb", 2);
pTest.add("ccc", 1);
в то время как (!pTest.isEmpty()){
System.out.println(pTest.remove());
}
}