في الأيام القليلة الماضية، كنت أعمل على تنفيذ قوائم الانتظار ذات الأولوية لأنه يجب أخذ سلامة الخيط في الاعتبار، فإن PriorityQueue غير قابلة للتطبيق. تتمثل إحدى طرق التنفيذ البسيطة في إدراج الأرقام ذات الأولوية الأعلى في قائمة انتظار واحدة، وتلك ذات الأولوية الأقل في قائمة انتظار أخرى. عند جلب الأرقام، قم أولاً بإحضار الأرقام من قائمة الانتظار ذات الأولوية الأعلى. والعيب في ذلك هو أنه كلما زادت مستويات الأولوية، زاد عدد قوائم الانتظار.
نظرًا لأنها تحتاج إلى أن تكون آمنة لسلسلة الرسائل، تستخدم قائمة الانتظار ConcurrentLinkedQueue، وهي آمنة لسلسلة الرسائل، وتقول وثائق واجهة برمجة التطبيقات (API) أن ConcurrentLinkedQueue يستخدم خوارزمية فعالة "خالية من الانتظار"، لذا فإن إنتاجيتها جيدة جدًا!
الكود البسيط هو كما يلي:
اختبار الحزمة؛
import 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");
إنت ط = 0 ,ي = 0 , ك= 0 ;
بينما (صحيح) {
بينما (صحيح) {
إذا (!highPriority.isEmpty()){
System.out.print(highPriority.remove());
أنا++;
ك++;
System.out.println( ", i = " +i+ ", k=" +k);
استراحة ؛
}
إذا (!lowPriority.isEmpty()){
System.out.print(lowPriority.remove());
ي++;
ك++;
System.out.println( ", j = " +j+ ", k=" +k);
استراحة ؛
}
استراحة ؛
}
يحاول {
Thread.sleep(100);
} قبض على (InterruptedException e) {
printStackTrace();
}
}
}
}
هناك طريقة أخرى وهي تنفيذ قائمة انتظار ذات أولوية قوية جدًا من خلال وراثة PriorityQueue وتنفيذ الواجهة القابلة للمقارنة، ثم إعادة كتابة طريقة المقارنة بنفسك، ومع ذلك، فإن العيب هو أنها ليست آمنة لمؤشر الترابط!
الرمز هو كما يلي:
اختبار الحزمة؛
import java.util.PriorityQueue;
الطبقة العامة PriorityTest تمتد PriorityQueue<PriorityTest.Test>{
يطبق اختبار الطبقة الثابتة Comparable<Test>{
حزمة السلسلة؛
فخر كثافة العمليات.
الاختبار العام (حزمة السلسلة، فخر int) {
هذا .packet = packet؛
هذه .priotity = الأولوية؛
}
كثافة العمليات العامة CompareTo(اختبار الوسيطة) {
إذا (الأولوية <arg.priotity)
العودة 1؛
وإلا إذا (الأولوية > arg.priotity)
العودة - 1 ;
آخر
العودة 0؛
}
سلسلة عامة إلى سلسلة () {
حزمة العودة؛
}
}
إضافة باطلة عامة (سلسلة سلسلة، أولوية int) {
super .add(new Test(str,priority));
}
الفراغ الثابت العام الرئيسي(String args[]){
PriorityTest pTest = new PriorityTest();
pTest.add( "aaa" , 3 ); // الأولوية القصوى
pTest.add("bbb" , 2 );
pTest.add("ccc" , 1 );
بينما (!pTest.isEmpty()){
System.out.println(pTest.remove());
}
}