zoukankan      html  css  js  c++  java
  • 阻塞队列

    阻塞队列

    image-20200803194903088

    image-20200803195927855

    四组API

    image-20200803200020368

    public class Test {
        public static void main(String[] args) throws InterruptedException {
            test4();
        }
        /**
         * 抛出异常
         */
        public static void test1(){
            // 队列的大小
            ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
    
            System.out.println(blockingQueue.add("a"));
            System.out.println(blockingQueue.add("b"));
            System.out.println(blockingQueue.add("c"));
            // IllegalStateException: Queue full 抛出异常!
            // System.out.println(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());
    
            // java.util.NoSuchElementException 抛出异常!
            // System.out.println(blockingQueue.remove());
        }
    
        /**
         * 有返回值,没有异常
         */
        public static void test2(){
            // 队列的大小
            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")); // false 不抛出异常!
            System.out.println("============================");
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll()); // null  不抛出异常!
        }
    
        /**
         * 等待,阻塞(一直阻塞)
         */
        public static void test3() throws InterruptedException {
            // 队列的大小
            ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
    
            // 一直阻塞
            blockingQueue.put("a");
            blockingQueue.put("b");
            blockingQueue.put("c");
            // blockingQueue.put("d"); // 队列没有位置了,一直阻塞
            System.out.println(blockingQueue.take());
            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");
            blockingQueue.offer("b");
            blockingQueue.offer("c");
            // blockingQueue.offer("d",2,TimeUnit.SECONDS); // 等待超过2秒就退出
            System.out.println("===============");
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            blockingQueue.poll(2,TimeUnit.SECONDS); // 等待超过2秒就退出
    
        }
    
    
    }
    

    同步队列SynchronousQueue

    • 没有容量,
    • 进去一个元素,必须等待取出来之后,才能再往里面放一个元素!
    • put、take
    /**
     * 同步队列
     * 和其他的BlockingQueue 不一样, SynchronousQueue 不存储元素
     * put了一个元素,必须从里面先take取出来,否则不能在put进去值!
     */
    public class SynchronousQueueDemo {
        public static void main(String[] args) {
            BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); // 同步队列
    
            new Thread(()->{
                try {
                    System.out.println(Thread.currentThread().getName()+" put 1");
                    blockingQueue.put("1");
                    System.out.println(Thread.currentThread().getName()+" put 2");
                    blockingQueue.put("2");
                    System.out.println(Thread.currentThread().getName()+" put 3");
                    blockingQueue.put("3");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"T1").start();
    
    
            new Thread(()->{
                try {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"T2").start();
        }
    }
    

    视频参考https://www.bilibili.com/video/BV1B7411L7tE
    上一篇:读写锁
    下一篇:线程池

  • 相关阅读:
    剑指offer:平衡二叉树
    剑指offer:数组中只出现一次的数字
    剑指offer:数字在排序数组中出现的次数
    剑指offer:两个链表的第一个公共结点
    剑指offer:数组中的逆序对
    剑指offer:丑数
    leetcode171 Excel列表序列号
    leetcode172 阶乘后的零
    leetcode 297二叉树的序列化与反序列化
    leetcode 31下一个排列
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443298.html
Copyright © 2011-2022 走看看