前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Concurrent包之BlockingQueue(阻塞式队列)

Concurrent包之BlockingQueue(阻塞式队列)

作者头像
姜同学
发布2022-10-27 16:23:02
1740
发布2022-10-27 16:23:02
举报
文章被收录于专栏:姜同学姜同学

概述

代码语言:javascript
复制
1.队列的原则:FIFO(先进先出)
2.BlockingQueue是有界限的,容量定义好之后不能改变 
3.阻塞:如果队列满了之后再往里面塞数据会阻塞,当队列为空时,则试图获取元素的操作会被阻塞。
4.BlockingQueue不允许元素为null

阻塞式队列的四个实现类

代码语言:javascript
复制
ArrayBlockingQueue -- 阻塞式顺序队列
a.底层使用数组来存储数据
b.使用的时候需要指定容量  

LinkedBlockingQueue -- 阻塞式链式队列
a.底层基于节点来存储数据
b.使用的时候可以指定容量也可以不指定。如果不指定容量,则容量为
Integer.MAX_VALUE,即的次方减,这种情况下一般认为这个队列是无限的。
如果指定了容量,则容量是不可变的.

PriorityBlockingQueue -- 具有优先级的阻塞式队列
a.底层是基于数组来存储数据
b.使用的时候可以不指定容量,如果不指定容量,则默认容量为
c.要求存入的元素必须实现Comparable接口
d.在PriorityBlockingQueue中,使用迭代遍历不保证排序

SynchronousQueue -- 同步队列
. 在使用的时候不需要指定容量,容量默认为且只能为

基于ArrayBlockingQueue对相关api的实现

代码语言:javascript
复制
package com.jmy.BlockingQueneDemo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/*
顺序阻塞时队列 底层使用数组结构
 */
public class ArrayBlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        // 使用时需要指定容量
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>();

        // 添加元素
        queue.add("a");
        queue.offer("b");
        queue.put("c");
        // 队列现在已满
        // 使用add添加元素会抛出异常
        queue.add("d"); // Exception in thread "main" java.lang.IllegalStateException: Queue full
        // 使用offer可以获取特殊的布尔返回值
        System.out.println(queue.offer("e")); // false
        // 使用put 会产生阻塞
        queue.put("f");
        // 使用offer的重载方法可以实现定时阻塞
        queue.offer("g",, TimeUnit.SECONDS);

        // 移除元素
        System.out.println(queue.remove());
        System.out.println(queue.poll());
        System.out.println(queue.take());
        // 队列元素为空
        // 使用remove 会抛出异常
        queue.remove(); // java.util.NoSuchElementException
        // 使用poll 可以得到返回值为null
        System.out.println(queue.poll());
        // 使用take 会产生阻塞
        queue.take();
        // 使用poll的重载方法实现定时阻塞
        queue.poll(,TimeUnit.SECONDS); // 阻塞3秒


    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-06T,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 阻塞式队列的四个实现类
  • 基于ArrayBlockingQueue对相关api的实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档