После реализации BoundedPriorityBlockingQueue в соответствии с предложением Фрэнка V я понял, что это не совсем то, что я хотел.
Основная проблема заключается в том, что элемент, который я должен вставить в очередь, может иметь более высокий приоритет, чем все, что уже есть в очереди.
Таким образом, что мне действительно нужно, так это метод 'pivot', если я помещаю объект в очередь, когда очередь заполнена, я хочу вернуть объект с самым низким приоритетом, а не блокировать.
Чтобы конкретизировать предложения Фрэнка V, я использовал следующие фрагменты ...
public class BoundedPriorityBlockingQueue<E>
implements
Serializable,
Iterable<E>,
Collection<E>,
BlockingQueue<E>,
Queue<E>,
InstrumentedQueue
{
...
закрытый финальный замок ReentrantLock; // = new ReentrantLock ();
частный финал Условие notFull;
final private int capacity;
final private PriorityBlockingQueue<E> queue;
public BoundedPriorityBlockingQueue(int capacity)
throws IllegalArgumentException,
NoSuchFieldException,
IllegalAccessException
{
if (capacity < 1) throw
new IllegalArgumentException("capacity must be greater than zero");
this.capacity = capacity;
this.queue = new PriorityBlockingQueue<E>();
// gaining access to private field
Field reqField;
try {
reqField = PriorityBlockingQueue.class.getDeclaredField("lock");
reqField.setAccessible(true);
this.lock = (ReentrantLock)reqField.get(ReentrantLock.class);
this.notFull = this.lock.newCondition();
} catch (SecurityException ex) {
ex.printStackTrace();
throw ex;
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
throw ex;
} catch (IllegalAccessException ex) {
ex.printStackTrace();
throw ex;
}
...
@Override
public boolean offer(E e) {
this.lock.lock();
try {
while (this.size() == this.capacity)
notFull.await();
boolean success = this.queue.offer(e);
return success;
} catch (InterruptedException ie) {
notFull.signal(); // propagate to a non-interrupted thread
return false;
} finally {
this.lock.unlock();
}
}
...
Здесь также есть некоторые инструменты, чтобы я мог проверить эффективность очереди.
Я все еще работаю над PivotPriorityBlockingQueue, если кому-то интересно, я могу опубликовать его.