PriorityBlockingQueue 우선 순위 규칙

2609 단어 BlockingQueue
Priority BlockingQueue에 저장된 대상은Comparable 인터페이스를 실현하는 것이어야 합니다.대기열은 이 인터페이스의compare 방법을 통해 대상의priority를 확정합니다.
규칙은: 현재 다른 대상과 비교할 때,compare 방법이 마이너스로 되돌아오면 대기열 안의 우선순위를 비교합니다.
다음 테스트는 이 단언을 설명할 수 있다.
인쇄 결과를take에서 나온Entity와left의entity를 비교하고priority를 비교합니다

public class TestPriorityQueue {
	
	static Random r=new Random(47);
	
	public static void main(String args[]){
		final PriorityBlockingQueue q=new PriorityBlockingQueue();
		ExecutorService se=Executors.newCachedThreadPool();
		//execute producer
		se.execute(new Runnable(){
			public void run() {
				int i=0;
				while(true){
					q.put(new PriorityEntity(r.nextInt(10),i++));
					try {
						TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		
		//execute consumer
		se.execute(new Runnable(){
			public void run() {
				while(true){
					try {
						out.println("take-- "+q.take()+" left:-- ["+q.toString()+"]");
						try {
							TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		out.println("shutdown");
	}

}

class PriorityEntity implements Comparable<PriorityEntity> {
	private static int count=0;
	private int id=count++;
	private int priority;
	private int index=0;

	public PriorityEntity(int _priority,int _index) {
		this.priority = _priority;
		this.index=_index;
	}
	
	public String toString(){
		return id+"# [index="+index+" priority="+priority+"]";
	}

	// , 
	public int compareTo(PriorityEntity o) {
		return this.priority > o.priority ? 1
				: this.priority < o.priority ? -1 : 0;
	}

	// , 
//	public int compareTo(PriorityTask o) {
//		return this.priority < o.priority ? 1
//				: this.priority > o.priority ? -1 : 0;
//	}
}

좋은 웹페이지 즐겨찾기