PriorityBlockingQueue 란?
- Comparator 를 이용한 특정 데이터를 기준으로 우선순위를 비교하는 Queue
- Queue의 특성상 FIFO 방식이 아닌 우선순위 기준으로 데이터 출력
- 정렬 불가능한 요소의 추가를 허용하지 않음
Example.
import java.util.concurrent.PriorityBlockingQueue;
// PriorityBlockingQueue를 가지고 있는 클래스
public class PriorityBlockingJobQueue {
final static PriorityBlockingJobQueue instance = new PriorityBlockingJobQueue();
PriorityBlockingQueue<PriorityJob> queue = new PriorityBlockingQueue<PriorityJob>(10, new CompareDescending());
public static PriorityBlockingJobQueue getInstance() {
return instance;
}
public void put(PriorityJob job){
queue.put(job);
}
public PriorityJob take() {
try {
return (PriorityJob) queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
// Queue에 삽입되는 데이터 모델
public class PriorityJob {
String priority; // 우선순위
Object job; // Job
public String getPriority() {
return priority;
}
public void setPriority(String priority) {
this.priority = priority;
}
public Object getJob() {
return job;
}
public void setJob(Object job) {
this.job = job;
}
}
// PriorityBlockingQueue 의 생성자 2번째 매개변수인 Comparator 구현체
// 특정 데이터 기준으로 우선순위를 정한다.
public class CompareDescending implements Comparator<PriorityJob>{
@Override
public int compare(PriorityJob o1, PriorityJob o2) {
return o1.getPriority().compareTo(o2.getPriority());
}
}
// Test Client
public class PriorityBlockingQueueTest {
public void excute() {
// Job 데이터 생성
PriorityJob job1 = new PriorityJob();
// 우선순위 설정
job1.setPriority("2");
// Job
job1.setJob("2");
// Queue에 생성된 Job을 put
PriorityBlockingJobQueue.getInstance().put(job1);
PriorityJob job2 = new PriorityJob();
job2.setPriority("0");
job2.setJob("0");
PriorityBlockingJobQueue.getInstance().put(job2);
PriorityJob job3 = new PriorityJob();
job3.setPriority("3");
job3.setJob("3");
PriorityBlockingJobQueue.getInstance().put(job3);
PriorityJob job4 = new PriorityJob();
job4.setPriority("1");
job4.setJob("1");
PriorityBlockingJobQueue.getInstance().put(job4);
PriorityJob job5 = new PriorityJob();
job5.setPriority("5");
job5.setJob("5");
PriorityBlockingJobQueue.getInstance().put(job5);
while(true) {
System.out.println(PriorityBlockingJobQueue.getInstance().take().getJob());
}
}
public static void main(String[] args) {
new PriorityBlockingQueueTest().excute();
}
}
## 테스트 클라이언트 출력 결과.
'Java' 카테고리의 다른 글
[Java] CPU 점유율이 높은 스레드 상태 분석(Thread dump) (0) | 2020.11.10 |
---|---|
[Java] Lombok (0) | 2020.10.20 |
[Java] Generics(제네릭) (0) | 2020.09.29 |
[Java] Heap Memory Dump Analysis (0) | 2020.09.26 |
[Java] StringTokenizer (0) | 2020.09.13 |