• 9. 阻塞队列


    BlockingQueue

    • 使用场景:多并发处理,线程池

    阻塞队列的使用

    四组API

    方式 抛出异常 有返回值,不抛异常 阻塞等待 超时等待
    添加 add offer put offer( , , )
    删除 remove poll take poll( , )
    检测队列首部 element peek

    代码测试

    package pers.vincent.matrix.subject.bq;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 阻塞队列
     */
    public class BlockingQueueTest {
    
        public static void main(String[] args) throws InterruptedException {
            test4();
        }
    
        /**
         * add / remove 抛出异常
         * 检测队列首部: element
         */
        public static void test1(){
            ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(4);
    
            blockingQueue.add("a");
            blockingQueue.add("b");
            blockingQueue.add("c");
            blockingQueue.add("d");
    
            System.out.println("===================================");
    
            System.out.println(blockingQueue.element());
    
            System.out.println(blockingQueue.remove());
            System.out.println(blockingQueue.remove());
            System.out.println(blockingQueue.remove());
            System.out.println(blockingQueue.remove());
        }
    
        /**
         * offer / poll 不抛异常
         * peek 检索队列首部
         */
        public static void test2(){
            ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(4);
    
            blockingQueue.offer("a");
            blockingQueue.offer("b");
            blockingQueue.offer("c");
            blockingQueue.offer("d");
    
            System.out.println("===================================");
    
            System.out.println(blockingQueue.peek());
    
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
        }
    
        /**
         * put / take 阻塞
         *
         * @throws InterruptedException
         */
        public static void test3() throws InterruptedException {
            ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(4);
    
            blockingQueue.put("a");
            blockingQueue.put("b");
            blockingQueue.put("c");
    
            System.out.println("===================================");
    
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
        }
    
        public static void test4() throws InterruptedException {
            ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(3);
    
            blockingQueue.offer("a", 2, TimeUnit.SECONDS);
            blockingQueue.offer("b", 2, TimeUnit.SECONDS);
            blockingQueue.offer("c", 2, TimeUnit.SECONDS);
    
            System.out.println("===================================");
    
            System.out.println(blockingQueue.poll(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));
        }
    }
    

    SynchronousQueue 同步队列

    SynchronousQueue 不存储元素,只要往里面put了就必须得take之后才能再put值进去

  • 相关阅读:
    Python语言基础03-分支和循环结构
    Python语言基础01-初识Python
    李宏毅深度学习笔记08---Bert、ELMO、GPT
    李宏毅深度学习笔记07---Transformer
    李宏毅深度学习笔记06---word embedding(词嵌入也称词向量)
    李宏毅深度学习笔记05---RNN 循环神经网络02
    李宏毅深度学习笔记04---RNN 循环神经网络01
    李宏毅深度学习笔记03---CNN 卷积神经网络
    李宏毅深度学习笔记02---深度学习的发展历程、3大研究步骤、
    李宏毅深度学习笔记---课程介绍
  • 原文地址:https://www.cnblogs.com/blackBlog/p/13451483.html
Copyright © 2020-2023  润新知