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 元素 

  • 相关阅读:
    linux下tomcat内存溢出
    leetcode
    HDU 4810 Wall Painting (位操作-异或)
    详解Java中的访问控制修饰符(public, protected, default, private)
    mpvue开发微信小程序之时间+日期选择器
    多行文本溢出隐藏
    swift 多态函数方式
    swift 多态函数方式
    swift 多态函数方式
    swift 多态函数方式
  • 原文地址:https://www.cnblogs.com/Syney/p/6852726.html
Copyright © 2011-2022 走看看