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();
}
}
私はすべてのメソッドを行う必要はありませんコメントでの議論をもとにEDIT 。更新されたコードは以下のようになります。
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