📌  相关文章
📜  Java中的 BlockingDeque offerLast() 方法及示例(1)

📅  最后修改于: 2023-12-03 14:42:44.647000             🧑  作者: Mango

Java中的 BlockingDeque offerLast() 方法

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秒钟之后分别从队列的尾部取出了这两个元素。在第一个线程插入元素时,由于双端队列已经满了,所以第二个线程必须先取出一个元素才能将第三个元素插入队列。在队列中增加了一个限制,可以避免过多的数据滞留在队列中,使得队列更加稳定和健壮。