📅  最后修改于: 2023-12-03 15:16:29.896000             🧑  作者: Mango
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() 方法返回的值可能是不准确的,因为在多线程场景下,可能有其他线程正在进行插入或删除操作。