• 理解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();
                }
            }
    
        }
    
    }
    
  • 相关阅读:
    Django学习笔记之中间件和上下文处理器
    python练手小题(四)
    python练手小题(三)
    python练手小题(二)
    python练手小题(一)
    Django学习笔记之自定义过滤器及标签
    Django学习笔记之模板标签与静态文件
    Django学习笔记之模板变量与模板过滤器
    Django学习笔记之url路由及模板渲染方式
    学习Go语言的9大理由
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551211.html
Copyright © 2020-2023  润新知