JDK1.8 BlockingQueue接口说明

Posted zhujm320

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK1.8 BlockingQueue接口说明相关的知识,希望对你有一定的参考价值。

介绍

BlockingQueue阻塞队列接口,定义了实现规范,线程安全。方便生成者和消费者模型使用,使用BlockingQueue时,开发者不需要考虑线程安全问题,将精力集中到业务实现即可。实际使用中,以生产者和消费者模型为例,分为三种情况: 1. 队列为空,生产者存入数据,消费者阻塞;2. 队列满,生产者阻塞,消费者拉取数据;3.队列非空非满,生产者可以存入数据,消费者也可以拉取数据。

队列实现原理参考

 

接口介绍

入队操作

boolean add(E e);

添加一个元素到队尾,成功时返回true,如果队列满,则抛出异常

boolean offer(E e);

添加一个元素到队尾,成功时返回true,如果队列满,则返回false

void put(E e) throws InterruptedException;

添加一个元素到队尾,成功时返回true,如果队列满,则阻塞,直到队列有空间

出队操作

E take() throws InterruptedException;

取元素,如果队列非空,直接返回队头元素,反正则阻塞直到队列非空才返回队头元素

E poll(long timeout, TimeUnit unit)
        throws InterruptedException;

取元素,如果队列非空,直接返回队头元素,反之则等待指定的时候,如果有元素则返回元素,反之返回null

队列容量

int remainingCapacity();

返回队列空闲的容量

删除操作

boolean remove(Object o);

删除指定的对象

int drainTo(Collection<? super E> c);

将队列中的元素放到给定的集合中,然后删除队列所有元素

int drainTo(Collection<? super E> c, int maxElements);

将指定大小的元素放到给定集合中,然后再在队列中删除

具体使用用例

入队示例

public void testAdd()
        try 
            BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
            boolean bRet = false;
            bRet = blockingQueue.add("1");
            bRet = blockingQueue.add("2");
            bRet = blockingQueue.add("3");
            bRet = blockingQueue.add("4");
            bRet = blockingQueue.add("5");
            bRet = blockingQueue.add("6");    //队列满,抛出IllegalStateException异常
            System.out.println("bRet: " + bRet);
        catch (Exception e)
            e.printStackTrace();
        
    
public void testOffer()
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
        boolean bRet = false;
        bRet = blockingQueue.offer("1");
        bRet = blockingQueue.offer("2");
        bRet = blockingQueue.offer("3");
        bRet = blockingQueue.offer("4");
        bRet = blockingQueue.offer("5");
        System.out.println("bRet: " + bRet);
        bRet = blockingQueue.offer("6");
        System.out.println("bRet: " + bRet);
    
public void testPut()
        try
            BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
            blockingQueue.put("1");
            blockingQueue.put("2");
            blockingQueue.put("3");
            blockingQueue.put("4");
            blockingQueue.put("5");
            System.out.println("put 5");
            blockingQueue.put("6");     //队列满,卡住,等待队列为空返回
            System.out.println("put 6");
        catch (Exception e)
            e.printStackTrace();
        
    

出队示例

public void testTake()
        try
            BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
            blockingQueue.put("1");
            blockingQueue.put("2");
            blockingQueue.put("3");

            String element = blockingQueue.take();
            System.out.println(element);
            element = blockingQueue.take();
            System.out.println(element);
            element = blockingQueue.take();
            System.out.println(element);
            element = blockingQueue.take();  //队列为空,卡住,直到队列有元素后返回
            System.out.println(element);
        catch (Exception e)
            e.printStackTrace();
        
    
/**
     * 通过poll取元素
     */
    public void testPoll()
            BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
            blockingQueue.offer("1");
            blockingQueue.offer("2");
            blockingQueue.offer("3");
            try
                String element = blockingQueue.poll(10, TimeUnit.MILLISECONDS);
                System.out.println(element);
                element = blockingQueue.poll(10, TimeUnit.MILLISECONDS);
                System.out.println(element);
                element = blockingQueue.poll(10, TimeUnit.MILLISECONDS);
                System.out.println(element);
                element = blockingQueue.poll(10, TimeUnit.MILLISECONDS);  //队列为空,等待10ms, 如果没有元素返回null
                System.out.println(element);
            catch (Exception e)
                e.printStackTrace();
            
    

删除元素示例

/**
     * 删除单个元素
     */
    public void testRemove()
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
        blockingQueue.offer("1");
        blockingQueue.offer("2");
        blockingQueue.offer("3");
        try
            System.out.println("queue.size: " + blockingQueue.size());
            boolean bRemove = blockingQueue.remove("1");
            System.out.println("remove 1 queue.size: " + blockingQueue.size());
            bRemove = blockingQueue.remove("2");
            System.out.println("remove 2 queue.size: " + blockingQueue.size());
            bRemove = blockingQueue.remove("3");
            System.out.println("remove 3 queue.size: " + blockingQueue.size());
        catch (Exception e)
            e.printStackTrace();
        
    
/**
     * 批量删除
     */
    public void testdrainTo()
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(5);
        blockingQueue.offer("1");
        blockingQueue.offer("2");
        blockingQueue.offer("3");
        try
            System.out.println("queue.size: " + blockingQueue.size());
            List<String> list = new ArrayList<>();
            blockingQueue.drainTo(list);
            System.out.println("queue.size: " + blockingQueue.size());
            System.out.println("list.size: " + list.size());
        catch (Exception e)
            e.printStackTrace();
        
    

 

 

 

以上是关于JDK1.8 BlockingQueue接口说明的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.8 ArrayBlockingQueue类说明

高效开发:JDK1.8的Lambada表达式

根据jdk1.8源码整理而得,java集合体系(继承实现关系)图解,超清晰,一看就懂,方便记忆

图解jdk1.8新特性---Lambda

jdk1.7和jdk1.8区别

大数据必学Java基础(四十五):JDK1.8以后的接口新增内容