Я пытаюсь создать недобросовестный буфер с двумя вызовами
- Добавить значение в буфер
- Очистить буфер
Потоки, которые очищаюточередь должна иметь более высокий приоритет те потоки, которые добавляют в очередь.
В случае, если буфер заполнен, я вызываю пустой метод внутри, чтобы позволить очереди опустошиться.
Основная идея заключается в том, что блокировки для буфера добавления ограничены addTimeout , а блокировки для пустого - emptyAddRatio * addTimeout , поэтому add будет иметь более высокий приоритет (предполагается, что у меня есть больше дополненийзатем пусто).
public class EmptyPriorityBuffer {
private ReentrantLock lock = new ReentrantLock(true);
private long addTimeout = 10;
private long emptyAddRatio = 5;
private int maxSize = 1000;
private LinkedBlockingDeque<Object> buffer = new LinkedBlockingDeque<>(maxSize);
public List<Object> empty() {
try {
lock.tryLock(addTimeout * emptyAddRatio, TimeUnit.MILLISECONDS);
ArrayList<Object> result = new ArrayList<>();
buffer.drainTo(result);
return result;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return Collections.emptyList();
}
public void add(Object object) {
try {
lock.tryLock(addTimeout, TimeUnit.MILLISECONDS);
if (!buffer.offer(object)) {
empty();
buffer.offer(object);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
Мой вопрос: Что произойдет в случае, когда буфер заполнен.
Текущий поток получил блокировку с помощью addtimeout, теперь он запрашиваетвложенная блокировка с emptyAddRatio * addTimeout witch больше чем addTimeout .
Будет ли прерываться поток после emptyAddRatio * addTimeout или addTimeout ?