Java

[Java] PriorityBlockingQueue

예은파파 2020. 10. 5. 15:16

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();

	}
}

 

## 테스트 클라이언트 출력 결과.

PriorityBlockingQueue

'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