JDK1.8 BlockingQueue详解

BlockingQueue简介

BlockingQueue是在JDK1.5时,随着J.U.C引入的一个接口:

public interface BlockingQueue<E> extends Queue<E> {
}

BlockingQueue继承了Queue接口,提供了一些阻塞方法,主要作用如下:

  1. 当线程向队列中插入元素时,如果队列已满,则阻塞线程,直到队列有空闲位置(非满);
  2. 当线程从队列中取元素(删除队列元素)时,如果队列为空,则阻塞线程,直到队列有元素;

既然BlockingQueue是一种队列,所以也具备队列的三种基本方法:插入删除读取

操作类型抛出异常返回特殊值阻塞线程超时
插入add(e)offer(e)put(e)offer(e, time, unit)
删除remove()poll()take()poll(time, unit)
读取element()peek()//

可以看到,对于每种基本方法,“抛出异常”和“返回特殊值”的方法定义和Queue是完全一样的。BlockingQueue只是增加了两类和阻塞相关的方法:put(e)take()offer(e, time, unit)poll(time, unit)

put(e)take()方法会一直阻塞调用线程,直到线程被中断或队列状态可用;
offer(e, time, unit)poll(time, unit)方法会限时阻塞调用线程,直到超时或线程被中断或队列状态可用。

public interface BlockingQueue<E> extends Queue<E> {
    /**
     * 插入元素e至队尾, 如果队列已满, 则阻塞调用线程直到队列有空闲空间.
     */
    void put(E e) throws InterruptedException;

    /**
     * 插入元素e至队列, 如果队列已满, 则限时阻塞调用线程,直到队列有空闲空间或超时.
     */
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 从队首删除元素,如果队列为空, 则阻塞调用线程直到队列中有元素.
     */
    E take() throws InterruptedException;

    /**
     * 从队首删除元素,如果队列为空, 则限时阻塞调用线程,直到队列中有元素或超时.
     */
    E poll(long timeout, TimeUnit unit) throws InterruptedException;

    // ...
}

除此之外,BlockingQueue还具有以下特点:

  • BlockingQueue队列中不能包含null元素;
  • BlockingQueue接口的实现类都必须是线程安全的,实现类一般通过“锁”保证线程安全;
  • BlockingQueue 可以是限定容量的。remainingCapacity()方法用于返回剩余可用容量,对于没有容量限制的BlockingQueue实现,该方法总是返回Integer.MAX_VALUE 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值