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

    java阻塞队列是一个支持阻塞的插入,移除的队列。
    阻塞的插入:向队列中插入元素时,若队满,则队列会阻塞插入的线程。
    阻塞的移除:移除队列中的一个元素时,若队空,则队列会阻塞移除的线程。直至队列非空。

    这里写图片描述

    从上图中可以看出,阻塞队列的所有实现类有:
    所有已知实现类:
    ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue
    1.ArrayBlockingQueue:数组结构的阻塞队列,按照FIFO(先进先出)原则,对队列元素进行排序。
    2.LinkedBlockingQueue:链表结构的阻塞对列,队列默认的最大长度:Integer.MAX_VALUE
    3.DelayQueue:支持延时的无界阻塞队列。
    4.PriorityBlockingQueue:支持优先级顺序的无界阻塞队列。

    阻塞队列不可用时,执行其方法的4种不同处理结果:

    这里写图片描述

    阻塞队列实现生产者,消费者模型

    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    /**
     * @author wangpei
     * @version 创建时间:2017年4月20日 下午3:06:07 阻塞队列实现生产者,消费者模型
     */
    public class ZuSeDuiLie {
    
        public static void main(String[] args) {
            BlockingQueue q = new ArrayBlockingQueue(1, true);// 只有一个元素
            produce p = new produce(q);
            consumer c = new consumer(q);
            Thread thread1 = new Thread(p);
            Thread thread2 = new Thread(c);
            thread1.start();
            thread2.start();
    
        }
    
    }
    
    class produce implements Runnable {// 生产者类
        private final BlockingQueue q;
    
        public produce(BlockingQueue q) {
            this.q = q;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    q.put(produce());// 若队列为满时,则会一直阻塞。
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
    
        }
    
        public Object produce() {
            System.out.println("生产出新零件");
            return "new Lingjian";// new LingJian();
    
        }
    
    }
    
    class consumer implements Runnable {
        private final BlockingQueue q;
    
        public consumer(BlockingQueue q) {
            this.q = q;
    
        }
    
        public void consume(String s) {
            System.out.println("我用了该零件");
    
        }
    
        @Override
        public void run() {
            while (true) {
    
                try {
                    consume((String) q.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    
  • 相关阅读:
    IDEA 实用功能Auto Import:自动优化导包(自动删除、导入包)
    idea 设置主题
    MySql where 后面使用函数导致索引失效问题
    IDEA报错,注解标红,提示Cannot resolve symbol xxx
    分批更新list
    java.lang.ArithmeticException: Rounding necessary
    Java selenium通过JS直接进行赋值给日期框
    postman接口测试之获取响应数据
    Jenkins集成allure测试报告
    Jenkins配置邮件通知
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551211.html
Copyright © 2011-2022 走看看