首页 > 其他分享 >BlockingQueue阻塞队列

BlockingQueue阻塞队列

时间:2022-10-20 23:15:31浏览次数:66  
标签:队列 System 阻塞 SECONDS println TimeUnit blockingQueue BlockingQueue out

BlockingQueue阻塞队列

image-20220418092217307

BlockingQueue的四组API

/**BlockQueue的四组API
 * 1.抛出异常
 * 2.有返回值,不抛出异常
 * 3.阻塞等待
 * 4.超时等待
 */
public class BlockQueueTest {
    public static void main(String[] args) throws InterruptedException {
        test03();
    }

    /**抛出异常
     * */
    public static void test01(){
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);//队列的长度
        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));
        //获取队首元素
        System.out.println(blockingQueue.element());
        //IllegalStateException: Queue full 抛出异常,列满
                  //blockingQueue.add("d");
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        //.NoSuchElementException 队空
        //System.out.println(blockingQueue.remove());

    }
    /**不抛出异常,有返回值
     * */
    public static void test02(){
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("b"));
        System.out.println(blockingQueue.offer("c"));
        //获取队首元素
        System.out.println(blockingQueue.peek());
        //有返回值,不抛出异常
       // System.out.println(blockingQueue.offer("d"));
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        //有返回值,不抛出异常
        //System.out.println(blockingQueue.poll());
    }
    /**阻塞等待,一直阻塞
     * */
    public static void test03() throws InterruptedException {
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
        arrayBlockingQueue.put("a");
        arrayBlockingQueue.put("b");
        arrayBlockingQueue.put("c");
        //队满,阻塞等待,一直等待
        //arrayBlockingQueue.put("d");
        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take());
        //队空,阻塞等待,一直等待
        //System.out.println(arrayBlockingQueue.take());
    }
    /**
     *超时等待,但不会一直等待,阻塞时间内等待,之后退出
     */
    public static void test04() throws InterruptedException {
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.offer("b", 2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.offer("c", 2, TimeUnit.SECONDS));
        //阻塞两秒,队满返回false退出
        // System.out.println(blockingQueue.offer("c", 2, TimeUnit.SECONDS));

        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        //阻塞异常,阻塞两秒,队空返回null
        // System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
    }
}

SynchronousQueue同步队列

image-20220418200119375

特点

  • 插入操作必须等待队列中的上一个元素被取出后才能插入,反之亦然。

  • 同步队列没有存储空间

  • 存储元素操作put() ,读取操作take( )

//同步队列
public class SynchronousQueueTest {
    public static void main(String[] args) {
        //SynchronousQueue是BlockingQueue的子类
        BlockingQueue<String> synchronousQueue = new SynchronousQueue<>();
        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName()+" put1");
                synchronousQueue.put("a");
                System.out.println(Thread.currentThread().getName()+" put2");
                synchronousQueue.put("b");
                System.out.println(Thread.currentThread().getName()+" put3");
                synchronousQueue.put("c");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"A").start();
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"----"+synchronousQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"----"+synchronousQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"----"+synchronousQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"B").start();
    }
}

标签:队列,System,阻塞,SECONDS,println,TimeUnit,blockingQueue,BlockingQueue,out
From: https://www.cnblogs.com/wfy-studying/p/16811703.html

相关文章

  • 单调队列&单调栈
    队列给你一个左右开口的容器,左进右出,可以知道先进去的一定先出来,所以可以用他的一些性质来实现一些操作,比如bfs就需要用到队列。手写队列比较麻烦,这里贴一下代码自行体会......
  • 单调队列&单调栈
    队列给你一个左右开口的容器,左进右出,可以知道先进去的一定先出来,所以可以用他的一些性质来实现一些操作,比如bfs就需要用到队列。手写队列比较麻烦,这里贴一下代码自行体会......
  • springcloud学习记录day4 -- 消息队列RubbitMQ
    同步通信和异步通信微服务间通讯有同步和异步两种方式:同步通讯:就像打电话,需要实时响应。异步通讯:就像发邮件,不需要马上回复。同步通信我们之前学习的Feign调用就属于......
  • Vue—关于响应式(二、异步更新队列原理分析)
    本节需要准备知识点:EventLoop、Promise关于EventLoop介绍参考阮一峰老师的文章:http://www.ruanyifeng.com/blog/2013/10/event_loop.htmlhttps://www.ruanyifeng.com......
  • C语言之走迷宫深度和广度优先(利用堆栈和队列)
     完成以下迷宫 利用二维数组储存每一个数组里的值,若是不能走则为1,若是可行就是0,走过了就设为2。一般是再复制一个数组,用来记录。堆栈的思想就是将一个点的上下左右......
  • 顺序队列
    顺序队列:在顺序队列中有queueElem,front,rear,maxSizequeueElem代表队列的存储空间front代表队首的位置rear代表队尾的位置的下一个位置。maxSize代表最多放存储个数。......
  • Elasticsearch 线程池和队列问题,请先看这一篇
    手敲脑图串讲Elasticsearch核心知识点1、线程池相关线上实战问题问题1:从Kafka消费数据导入elasticsearch时,批量bulk写入抛异常被拒绝。ES集群四个节点,其中:两个节......
  • 技术分享| 消息队列Kafka群集部署
    一、简介1、介绍Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志......
  • 队列queue的poll()和remove()的区别
    队列是一个典型的先进先出(FIFO)的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的。在Queue中poll()和remove()有什么区别相......
  • 技术分享| 消息队列Kafka群集部署
    一、简介1、介绍Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日......