지난 며칠간 우선순위 큐 구현 작업을 진행했는데 스레드 안전성을 고려해야 하기 때문에 PriorityQueue는 적용되지 않습니다. 매우 간단한 구현 방법은 우선 순위가 높은 것을 하나의 대기열에 삽입하고, 우선 순위가 낮은 것을 다른 대기열에 삽입하는 것입니다. 숫자를 가져올 때 먼저 우선 순위가 높은 대기열에서 숫자를 가져옵니다. 단점은 우선순위 수준이 높을수록 대기열이 많아진다는 것입니다.
스레드로부터 안전해야 하기 때문에 대기열은 스레드로부터 안전한 ConcurrentLinkedQueue를 사용하고 API 문서에 따르면 ConcurrentLinkedQueue는 효과적인 "대기 없는" 알고리즘을 사용하므로 처리량이 매우 좋습니다!
간단한 코드는 다음과 같습니다.
패키지 테스트;
import java.util.concurrent.ConcurrentLinkedQueue;
공개 클래스 PriorityQueueTest {
공개 정적 무효 메인(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 ;
동안(참){
동안(참){
if (!highPriority.isEmpty()){
System.out.print(highPriority.remove());
나++;
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);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
}
}
}
또 다른 방법은 PriorityQueue를 상속하고 Comparable 인터페이스를 구현하여 매우 강력한 우선순위 대기열을 구현한 다음, CompareTo 메서드를 직접 다시 작성하는 것입니다. 그러나 단점은 스레드로부터 안전하지 않다는 것입니다.
코드는 다음과 같습니다:
패키지 테스트;
import java.util.PriorityQueue;
공개 클래스 PriorityTest는 PriorityQueue<PriorityTest.Test>{를 확장합니다.
정적 클래스 테스트는 Comparable<Test>{를 구현합니다.
문자열 패킷;
자존심이 없네;
공개 테스트(문자열 패킷, 정수 프라이드) {
이 .packet = 패킷;
이 .우선순위 = 우선순위;
}
공개 int CompareTo(테스트 인수) {
if (우선순위 < arg.우선순위)
1을 반환합니다.
else if (우선순위 > arg.priotity)
반환 - 1 ;
또 다른
0을 반환합니다.
}
공개 문자열 toString(){
반환 패킷;
}
}
공공 무효 추가(문자열 str, int 우선 순위){
super .add( new Test(str,priority));
}
공개 정적 무효 메인(문자열 인수[]){
PriorityTest pTest = new PriorityTest();
pTest.add( "aaa" , 3 ) //가장 높은 우선순위
pTest.add( "bbb" , 2 );
pTest.add( "ccc" , 1 );
동안 (!pTest.isEmpty()){
System.out.println(pTest.remove());
}
}