java基于数组实现队列(二)
概述
实现上一篇博客中提到的
当前的实现中,入队时,如果队列已满则入队失败,能不能不要立刻返回失败,而是等一段时间看是否有出队操作,如果发生了出队,不就可以入队了?怎么实现?(1)
实现
改造offer()
public void offerV2(int value) {
lock.lock();
while (tail == capacity) { //队列放满了 死循环一直等到至少一次出队操作完成 这时不就可以入队成功了?
log.info("元素 {} 入队失败 因为队列放满了 等到至少一次出队操作后才可以入队成功", value);
}
try {
arr[tail] = value;
log.info("元素 {}入队成功",value);
tail++;
}finally {
lock.unlock();
}
}
测试用例
public static void main(String[] args) throws InterruptedException {
ArrayQueue queue = new ArrayQueue(3);
Thread t1 = new Thread(() -> {
queue.offerV2(1);
queue.offerV2(2);
}, "t1");
Thread t2 = new Thread(() -> {
queue.offerV2(3);
}, "t2");
Thread t3 = new Thread(() -> {
queue.offerV2(4);
}, "t3");
t1.start();
t2.start();
t3.start();
//25ms以后执行一次出队操作 由于发生了出队操作 入队操作就应该可以成功
log.info("25ms以后执行一次出队操作");
TimeUnit.MILLISECONDS.sleep(25);
int polled = queue.poll();
log.info("出队的元素:{}",polled);
// t1 t2 t3 3个线程的代码都执行完后再遍历队列
t1.join();
t2.join();
t3.join();
queue.print();
}
测试用例输出
扩展
1.可以不用循环实现吗?有其他实现方法吗?
2.实现
当前的实现中,出队时,如果队列为空则提示队列为空,能不能不要立刻提示队列为空,而是等一段时间看是否有入队操作,如果有入队,不就可以出队了?怎么实现?
这个感兴趣的朋友可以自己实现下。
最后
好了,如果对你有帮助的话,欢迎点个免费的赞哦。