BockingQueue的核心方法

84 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

BockingQueue的核心方法

它是一个队列,支持阻塞机制,阻塞的放入和得到数据。

常用方法:

Offer(anObject):表示如果有可能,将anObject加到队列中,如果可以容纳,则返回true,否则返回false,(本方法不阻塞当前执行线程的方法)。

Put(anObject):把anObject添加到队列中,如果队列没有空间,调用方法的线程被阻塞,直到队列有空间再加入。

Poll(time):取走队列中排在首位的对象,若取不出,可以等time规定的时间,取不到时返回null.

Take():取走队列中排在首位的对象,如果队列为空,调用方法的线程被阻塞,直到队列有新元素在取出。

DrainTo():一次从队列中取出所有元素,可以提升效率,不用分配取元素。

模拟linkedBlockingQueue的put和take方法

Put:把object添加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断,直到BlockingQueue里面有空间在继续。

Take:取走BlockingQueue里排在首位的对象,若BolckingQueue为空,阻断进入阻塞状态,直到BlockingQueue加入新的元素。

image.png 抛出异常

当阻塞队列满时,再往队列里add插入元素会抛llegalStateException: Queue full

当阻塞队列空时,再往队列里remove 移除元素会抛NoSuchElementException

特殊值

插入方法,成功ture失败false

移除方法,成功返回出队列的元素,队列里面没有就返回null

一直阻塞

当阻塞队列满时,生产者线程继续往队列里put元素,队列会一直阻塞生产线程直到put数据or响应中断退出。

当阻塞队列空时,消费者线程试图从队列里take元素,队列会一直阻塞消费者线程直到队列可用。 超时退出

当阻塞队列满时,队列会阻塞生产者线程- -定时间,超过后限时后生产者线程会退出

异常用法

element()是检查队头元素是谁

package com.wsx.blockingQueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

        public class BlockingQueueDemo {
            public static void main(String[] args) {
                BlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

                System.out.println(queue.add("1"));
                System.out.println(queue.add("2"));
                System.out.println(queue.add("3"));
                //System.out.println(queue.add("6"));

                System.out.println(queue.element());

                System.out.println(queue.remove());
                System.out.println(queue.remove());
                System.out.println(queue.remove());
                //System.out.println(queue.remove());
            }
        }

特殊值用法(也就是布尔值)

peek()是查看队列顶端元素

offer添加超过队长返回false

pull拿值无值返回null

package com.wsx.blockingQueue;

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

        public class BlockingQueueDemo2 {
            public static void main(String[] args) {
                BlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

                try {
                    System.out.println(queue.offer(1,1, TimeUnit.SECONDS));
                    System.out.println(queue.offer(2,1, TimeUnit.SECONDS));
                    System.out.println(queue.offer(3,1, TimeUnit.SECONDS));
                    System.out.println(queue.offer(4,1, TimeUnit.SECONDS));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println();
                System.out.println(queue.peek());
                System.out.println();

                try {
                    System.out.println(queue.poll(1,TimeUnit.SECONDS));
                    System.out.println(queue.poll(1,TimeUnit.SECONDS));
                    System.out.println(queue.poll(1,TimeUnit.SECONDS));
                    System.out.println(queue.poll(1,TimeUnit.SECONDS));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }