📅  最后修改于: 2023-12-03 14:42:44.647000             🧑  作者: Mango
BlockingDeque
接口继承了 BlockingQueue
接口,并在其基础上增加了一些双端队列相关的操作方法。其中 offerLast()
方法用于将指定元素插入此双端队列的尾部,如果当前容量满了则一直阻塞等待直到容量可用。
boolean offerLast(E e) throws InterruptedException;
参数说明:
e
:插入的元素返回值:插入是否成功。如果该元素被插入队列,则返回 true
。如果队列已满,则返回 false
。
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
public class BlockingDequeExample {
public static void main(String[] args) {
BlockingDeque<Integer> deque = new LinkedBlockingDeque<>(2);
new Thread(() -> {
try {
deque.putLast(1);
System.out.println(Thread.currentThread().getName() + ": put 1 into deque");
deque.putLast(2);
System.out.println(Thread.currentThread().getName() + ": put 2 into deque");
deque.putLast(3); // 阻塞等待
System.out.println(Thread.currentThread().getName() + ": put 3 into deque");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
Thread.sleep(1000L); // 睡眠1秒钟
Integer value = deque.takeLast();
System.out.println(Thread.currentThread().getName() + ": take " + value + " from deque");
Thread.sleep(1000L); // 睡眠1秒钟
value = deque.takeLast();
System.out.println(Thread.currentThread().getName() + ": take " + value + " from deque");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
输出结果:
Thread-0: put 1 into deque
Thread-0: put 2 into deque
Thread-1: take 2 from deque
Thread-1: take 1 from deque
在上面的示例中,我们创建了一个容量为2的 LinkedBlockingDeque
,并开启了两个线程。其中一个线程连续插入了 1 和 2 这两个元素,另一个线程在等待了1秒钟之后分别从队列的尾部取出了这两个元素。在第一个线程插入元素时,由于双端队列已经满了,所以第二个线程必须先取出一个元素才能将第三个元素插入队列。在队列中增加了一个限制,可以避免过多的数据滞留在队列中,使得队列更加稳定和健壮。