开发者社区> 问答> 正文

描述线程池工作队列ArrayBlockingQueue

描述线程池工作队列ArrayBlockingQueue

展开
收起
huc_逆天 2021-01-08 15:33:21 845 0
1 条回答
写回答
取消 提交回答
  • 一、什么是ArrayBlockingQueue?

    ArrayBlockingQueue是一个阻塞的队列,继承了AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据,所以它是基于数组的阻塞队列。ArrayBlockingQueue是有边界值的,在创建ArrayBlockingQueue时就要确定好该队列的大小,一旦创建,该队列大小不可更改。内部的全局锁是使用的ReentrantLock。

    二、使用场景

    1.先进先出(队首是最旧的元素;队尾是新添加的元素) 2.有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作) 3.队列不支持空元素

    三、常用的方法(只列举了其中几种)

    1.构造方法

    capacity:队列初始化大小

    fair:表示该队列中的可重入锁是否公平,默认为false

    c:添加的集合

    ArrayBlockingQueue(int capacity)
    ArrayBlockingQueue(int capacity, boolean fair)
    ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
    

    2.add方法

    在队列的尾部添加元素,返回true。当队列满的时候会抛出IllegalStateException异常。

    boolean add(E e)
    

    3.offer方法

    在队列的尾部添加元素,如果添加成功返回true,否则返回false。

    e:添加的元素

    timeout:最多等待的时长

    unit:时间单位

    boolean offer(E e)
    boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException
    

    4.put方法

    在队列的尾部添加元素,如果队列已满,则会阻塞住,等待队列有空闲位置,该方法可被打断。

    void put(E e) throws InterruptedException
    

    5.take方法

    获取队列中的元素,如果没有则会被阻塞住。

    E take() throws InterruptedException
    
    2021-02-03 18:22:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载