zoukankan      html  css  js  c++  java
  • ArrayBlockingQueue和LinkedBlockingQueue

    1、BlockingQueue接口定义了一种阻塞的FIFO queue

    ArrayBlockingQueue和LinkedBlockingQueue的区别:

    1. 队列中锁的实现不同

        ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁;

        LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock

    2. 在生产或消费时操作不同

        ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;

        LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会影响性能

    3. 队列大小初始化方式不同

        ArrayBlockingQueue实现的队列中必须指定队列的大小;

        LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE

    方法:

    offer

    将元素插入队列,成功返回true,如果当前没有可用的空间,则返回false

    offer(E e, long timeout, TimeUnit unit) 

    将元素插入队列,在到达指定的等待时间前等待可用的空间

    E poll(long timeout, TimeUnit unit) 

    获取并移除队列的头部,在指定的等待时间前等待可用的元素

    void put(E e) 

    将元素插入队列,将等待可用的空间(堵塞)

    take() 

    获取并移除队列的头部,在元素变得可用之前一直等待(堵塞)

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。

    注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生不确定的结果。

    并行和并发区别

    1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;
    2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率

    LinkedBlockingQueue
    由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。

    LinkedBlockingQueue对象是 线程阻塞-安全的 ,不接受 null 元素 

  • 相关阅读:
    jQuery EasyUI API 中文文档 可调整尺寸
    jQuery EasyUI API 中文文档 链接按钮(LinkButton)
    jQuery EasyUI API 中文文档 手风琴(Accordion)
    jQuery EasyUI API 中文文档 表单(Form)
    jQuery EasyUI API 中文文档 组合(Combo)
    jQuery EasyUI API 中文文档 布局(Layout)
    jQuery EasyUI API 中文文档 拆分按钮(SplitButton)
    jQuery EasyUI API 中文文档 菜单按钮(MenuButton)
    jQuery EasyUI API 中文文档 搜索框
    jQuery EasyUI API 中文文档 验证框(ValidateBox)
  • 原文地址:https://www.cnblogs.com/Syney/p/6852726.html
Copyright © 2011-2022 走看看