【并发编程学习】LinkedBlockingQueue 阻塞队列的简单使用

LinkedBlockingQueue 是一个 线程安全阻塞 队列,接下来就讲解一下它最常用的基本方法。

这是队列的数据结构图。
在这里插入图片描述


方法介绍

无参构造方法

无参构造函数,内部源码是在创建队列时默认给队列的最大长度为 int 的最大值,如果当你给这个队列传入的数据超过了 int 的最大值,就会报错。

LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue();

int 单参构造方法

int 类型单参构造方法,创建队列时给定队列的最大长度,这里需要注意的是,给定的长度不能小于等于 0,否则会报异常。

LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue(1000);

Collection 单参构造方法

创建队列时,给定队列一个集合,构造方法中会做两件事情:
第一件事是会把队列的最大长度设置成 int 的最大值
第二件事是会把给定的集合中的数据都放到队列中

Collection collection = new ArrayList();
LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue(collection);

查看队列中的元素数量

size()

LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue();
final int size = linkedBlockingQueue.size();

查看还可以往队列中放多少元素

remainingCapacity()

列如,一开始创建队列时设置队列的长度是 10,然后往该队列中存了 3 个元素,那么调用该方法就会返回 7。

LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue(10);
linkedBlockingQueue.put("张三");
// 9
final int remainingCapacity = linkedBlockingQueue.remainingCapacity();

入队方法

put(E e)
往队尾中添加一个元素,如果队列已经满了则等待,直到插入队列中。

LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue();
linkedBlockingQueue.put("张三");

offer(E e)

往队尾中添加一个元素,如果队列已满,则返回false,插入进去返回true。

LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue();
// TimeUnit.MILLISECONDS 是时间格式
linkedBlockingQueue.offer("张三");

offer(E e, long timeout, TimeUnit unit)

往队列中添加一个元素并设置一个时间,这个时间是如果在规定时间内没有插入,则返回false,插入队列中返回true。

LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue();
// TimeUnit.MILLISECONDS 是时间格式
linkedBlockingQueue.offer("张三", 1000, TimeUnit.MILLISECONDS);

出队方法

take()

从队列的队首取出一个数据,如果队列没有数据,则一直等待,直到有数据取出为止。

LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue();
linkedBlockingQueue.put("张三");
String str = linkedBlockingQueue.take();

peek()

从队列的队首取出一个数据,如果队列没有数据,则返回null。

LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue();
linkedBlockingQueue.put("张三");
String str = linkedBlockingQueue.take();




End


猜你喜欢

转载自blog.csdn.net/weixin_43657300/article/details/128576307