ในช่วงไม่กี่วันที่ผ่านมา ฉันได้ดำเนินการเกี่ยวกับการดำเนินการคิวลำดับความสำคัญ เนื่องจากต้องคำนึงถึงความปลอดภัยของเธรด จึงไม่สามารถใช้ PriorityQueue ได้ วิธีการนำไปใช้ที่ง่ายมากคือการแทรกอันที่มีลำดับความสำคัญสูงกว่าลงในคิวหนึ่ง และอันที่มีลำดับความสำคัญต่ำกว่าลงในอีกคิวหนึ่ง เมื่อดึงตัวเลข ให้ดึงตัวเลขจากคิวที่มีลำดับความสำคัญสูงกว่าก่อน ข้อเสียคือยิ่งมีระดับความสำคัญมากเท่าไรก็ยิ่งมีคิวมากขึ้นเท่านั้น
เนื่องจากต้องมีความปลอดภัยของเธรด คิวจึงใช้ ConcurrentLinkedQueue ซึ่งปลอดภัยสำหรับเธรด และเอกสาร API ระบุว่า ConcurrentLinkedQueue ใช้อัลกอริธึม "ไม่ต้องรอ" ที่มีประสิทธิภาพ ดังนั้นปริมาณงานจึงดีมาก!
รหัสง่ายๆมีดังนี้:
การทดสอบบรรจุภัณฑ์
นำเข้า java.util.concurrent.ConcurrentLinkedQueue;
PriorityQueueTest ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
ConcurrentLinkedQueue <String> highPriority = ใหม่ ConcurrentLinkedQueue <String>(); // ลำดับความสำคัญสูง
ConcurrentLinkedQueue <String> lowPriority = ใหม่ ConcurrentLinkedQueue <String>(); // ลำดับความสำคัญต่ำ
highPriority.add( "aaa" );
highPriority.add( "bbb" );
highPriority.add( "111" );
lowPriority.add( "ซีซีซี" );
lowPriority.add( "ddd" );
lowPriority.add( "222" );
int i = 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());
เจ++;
เค++;
System.out.println( ", j = " +j+ ", k=" +k);
หยุดพัก ;
-
หยุดพัก ;
-
พยายาม {
เธรด.สลีป(100);
} จับ (InterruptedException e) {
e.printStackTrace();
-
-
-
-
อีกวิธีหนึ่งคือการใช้คิวลำดับความสำคัญที่ทรงพลังมากโดยการสืบทอด PriorityQueue และใช้อินเทอร์เฟซที่เปรียบเทียบได้ จากนั้นจึงเขียนเมธอด comparisonTo ด้วยตัวเอง อย่างไรก็ตาม ข้อเสียคือมันไม่ปลอดภัยสำหรับเธรด!
รหัสมีดังนี้:
การทดสอบบรรจุภัณฑ์
นำเข้า java.util.PriorityQueue;
PriorityTest คลาสสาธารณะขยาย PriorityQueue<PriorityTest.Test>{
การทดสอบคลาสคงที่นำไปใช้เปรียบเทียบได้ <ทดสอบ> {
แพ็กเก็ตสตริง;
ความภาคภูมิใจภายใน;
การทดสอบสาธารณะ (แพ็คเก็ต String, int ความภาคภูมิใจ) {
นี้ .packet = แพ็คเก็ต;
นี้ .priotity = ลำดับความสำคัญ;
-
int สาธารณะ CompareTo (ทดสอบหาเรื่อง) {
ถ้า (ลำดับความสำคัญ < arg.priotity)
กลับ 1;
อย่างอื่นถ้า (priotity > arg.priotity)
กลับ - 1 ;
อื่น
กลับ 0;
-
สตริงสาธารณะ toString(){
ส่งคืนแพ็คเก็ต;
-
-
โมฆะสาธารณะเพิ่ม (String str, ลำดับความสำคัญ int) {
super .add( การทดสอบใหม่ (str, ลำดับความสำคัญ));
-
โมฆะคงที่สาธารณะ main (String args []) {
PriorityTest pTest = ใหม่ PriorityTest();
pTest.add( "aaa" , 3 ); // ลำดับความสำคัญสูงสุด
pTest.add( "bbb" , 2 );
pTest.add( "ซีซีซี" , 1 );
ในขณะที่ (!pTest.isEmpty()){
System.out.println(pTest.remove());
-
-