面试准备 -- 线程池队列LinkedBlockingQueue详解

前面学了 Executor 框架,线程池参数,以及基本线程池的使用,今天来学学面试问的核心 – 线程池中的队列队列。在聊聊 java 线程池一文中,简单介绍了几种常用的阻塞队列,但都是一笔带过,接下来的文章会着重讲线程池中的队列。
由于线程池中使用的队列有多种,接下来会分多篇文章进行学习。

LinkedBlockingQueue队列:
首先我们先看看下图关系图
从上图我们可以很清楚的看到 LinkedBlockingQueue 类中关系,Collection 接口我想大家都很熟悉,平时我们在开发中最常用的 List,Set 顶层也是该接口。按照 java 的语言风格,基本是不断抽象出公共接口,子接口或抽象类则在原有的基础上提供独有的方法。
而 LinkedBlockingQueue 是 BlockingQueue 的实现类,那我们需要先看看 BlockingQueue 提供了哪些方法。

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

    //将对象塞入队列,如果塞入成功返回true, 否则返回false。
    boolean add(E e);

    //将对象塞入到队列中,如果设置成功返回true, 否则返回false
    boolean offer(E e);

    //将元素塞入到队列中,如果队列中已经满了,
    //则该方法会一直阻塞,直到队列中有多余的空间。
    void put(E e) throws InterruptedException;

    //将对象塞入队列并设置时间
    //如果塞入成功返回 true, 否则返回 false.
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    //从队列中取对象,如果队列中没有对象,
    //线程会一直阻塞,直到队列中有对象,并且该方法取得了该对象。
    E take() throws InterruptedException;

    //在给定的时间里,从队列中获取对象,
    //时间到了直接调用普通的poll方法,为null则直接返回null。
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;

    //获取队列中剩余长度。
    int remainingCapacity();

    //从队列中移除指定的值。
    boolean remove(Object o);

    //判断队列中包含该对象。
    public boolean contains(Object o);

    //将队列中对象,全部移除,并加到传入集合中。
    int drainTo(Collection<? super E> c);

    //指定最多数量限制将队列中对,全部移除,并家到传入的集合中。
    int drainTo(Collection<? super E> c, int maxElements);
}

看完上面的代码,我们基本知道了 LinkedBlockingQueue 队列有什么方法,简单说就是实现 BlockingQueue 接口的提供的方法。LinkedBlockingQueue 源码中包含很多知识点,比如:显示锁和线程间通信的方式。几天前大佬分析过一篇文章里就讲了线程通信的 Condition 接口,锁的话也稍微讲了些,这里就默认都会的情况下来看。

 	 /** 显示锁,在将对象从队列中取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值