요소를 추가하는 동안 큐가 가득 차면 큐의 헤드가 제거되는 ArrayBlockingQueue와 같은 간단한 큐를 작성하려고합니다. 이 클래스는 큐의 선두에서 요소를 얻으려면 대기열 ArrayBlockingQueue 요소를 추가하는 동안 큐가 가득 차면 큐 헤드가 제거됩니다.
- 아래에 있어야합니다. 사용할 수있는 요소가없는 경우.
- 는 큐의 말미에 요소를 추가하려면
사람이 아래의 코드를 검토하고이 일을 더 나은 방법이 있는지 알려 주시기 바랍니다 수 있습니까?
public class CircularArrayNonBlockingQueue<E> {
private ArrayBlockingQueue<E> blockingQueue;
public CircularArrayNonBlockingQueue(int size) {
blockingQueue = new ArrayBlockingQueue<>(size);
}
public synchronized int size() {
return blockingQueue.size();
}
public synchronized void add(E element) {
if(blockingQueue.remainingCapacity() <= 0) {
blockingQueue.poll();
}
blockingQueue.add(element);
}
public synchronized E poll() {
return blockingQueue.poll();
}
}
나는 모든 방법 synchronized
을 할 필요가 없습니다 코멘트에 대한 논의를 바탕으로 편집 . 업데이트 된 코드는 다음과 같습니다.
public class CircularNonBlockingQueue<E> {
private final ArrayBlockingQueue<E> blockingQueue;
public CircularNonBlockingQueue(int size) {
blockingQueue = new ArrayBlockingQueue<>(size);
}
public int size() {
return blockingQueue.size();
}
public synchronized void add(E element) {
if(blockingQueue.remainingCapacity() <= 0) {
blockingQueue.poll();
}
blockingQueue.add(element);
}
public E take() throws InterruptedException {
return blockingQueue.take();
}
}
나에게 잘 어울려요 :-) – PillHead
ReadWriteLock을 사용하여 동기화를 최적화 할 수 있습니다 – PillHead
@PillHead - 좀 더 설명해 주시겠습니까? – tuk