📌  相关文章
📜  Java中的LinkedBlockingDeque size() 方法(1)

📅  最后修改于: 2023-12-03 15:16:29.896000             🧑  作者: Mango

Java中的LinkedBlockingDeque size() 方法

简介

LinkedBlockingDeque是Java中的一个双端队列,继承自AbstractQueue,实现了BlockingQueue接口。它是线程安全的、可阻塞的队列,插入和删除操作都是非常高效的。size() 方法是LinkedBlockingDeque类的一个实例方法,用于获取当前队列中元素的个数。

方法签名
public int size()

该方法返回当前队列中元素的个数。

示例代码
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

public class LinkedBlockingDequeDemo{

    public static void main(String[] args){
        // 创建一个容量为2的LinkedBlockingDeque队列
        LinkedBlockingDeque<Integer> deque = new LinkedBlockingDeque<>(2);

        // 向队列尾部添加元素
        deque.offerLast(1);
        deque.offerLast(2);

        // 获取队列中元素的个数
        int size1 = deque.size();
        System.out.println("size1: " + size1); // 输出: size1: 2

        // 向队列尾部添加元素,此时队列已满
        deque.offerLast(3);

        // 获取队列中元素的个数
        int size2 = deque.size();
        System.out.println("size2: " + size2); // 输出: size2: 2

        // 从队列头部取出元素
        Integer poll1 = deque.pollFirst();

        // 获取队列中元素的个数
        int size3 = deque.size();
        System.out.println("size3: " + size3); // 输出: size3: 1

        // 从队列头部取出元素,设置等待时间为1秒
        try{
            Integer poll2 = deque.pollFirst(1, TimeUnit.SECONDS);
        }catch(InterruptedException e){
            e.printStackTrace();
        }

        // 获取队列中元素的个数
        int size4 = deque.size();
        System.out.println("size4: " + size4); // 输出: size4: 0
    }

}
解析示例代码

示例代码中创建了一个容量为2的LinkedBlockingDeque队列,并向队列尾部添加了两个元素。此时,调用size() 方法返回2,表示队列中有两个元素。

随后,再次向队列尾部添加元素,此时队列已满,再次调用size() 方法返回2,表示队列中有两个元素。

后面的代码中,从队列头部取出元素,并再次调用size() 方法,可以看到每次取出元素后队列中的元素个数都会减少。

如果从队列头部取出元素时,队列为空,则调用pollFirst(long timeout, TimeUnit unit) 方法会使当前线程进入阻塞状态,等待1秒钟,如果还没有元素可取,则会抛出InterruptedException 异常。

注意事项

当LinkedBlockingDeque插入或删除元素时,size() 方法返回的值可能是不准确的,因为在多线程场景下,可能有其他线程正在进行插入或删除操作。

参考资料