您当前的位置:首页 > 文章摘抄 > 正文

blockingqueue(java中queue和blockingqueue的区别)

本文目录

  • java中queue和blockingqueue的区别
  • arrayblockingqueue为什么使用了lock而没有使用synchronized
  • ArrayBlockingQueue和LinkedBlockingQueue的区别
  • BlockingQueue和List 有什么区别,BlockingQueue用在什么场景下
  • BlockingQueue可用于什么场合
  • LinkedBlockingQueue和ArrayBlockingQueue的异同
  • 多线程的队列blockqueue如何理解
  • BlockingQueue 怎么判断全部堵塞
  • 关于JAVA BlockingQueue的工作原理

java中queue和blockingqueue的区别

内容主要来自jdk的api,大家可参考jdkapi  1.BlockingQueue:支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。  2.BlockingQueue 不接受 null 元素。  3.BlockingQueue 可以是限定容量的。  4.BlockingQueue 实现是线程安全的。Queue不是线程安全的。因此可以将Blockingqueue用于用于生产者-使用者队列。  根据Api修改的一个例子,大家可以修改自己体验BlockingQueue的使用package test;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;/** * 生产者 * @author wasw100 */class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { for (int i = 0; i 《 3; i++) { queue.put(produce()); System.out.println(“生产后:“+queue.peek()); } } catch (InterruptedException ex) { ex.printStackTrace(); } } Character produce() { char c = (char) (Math.random() * 26 + ’A’); System.out.println(“生产前:“ + c); return c; }}/** * 消费者 * @author wasw100 */class Consumer implements Runnable {private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); //Thread.sleep(100); } } catch (InterruptedException ex) { ex.printStackTrace(); } } void consume(Character c) { System.out.println(“消费:“ + c); }}/** * 一个生产者、两个消费者 * * @author wasw100 */class Setup { public static void main(String args) { BlockingQueue q = new ArrayBlockingQueue(1); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); }}

arrayblockingqueue为什么使用了lock而没有使用synchronized

ArrayBlockingQueue 是JDK1.5才加进来的类,在JDK1.5 ReentrantLock 的应能远远好于Synchronized,不过在1.6以后,Synchronized 已经进行了优化,二者的性能已经差不了多少了。而且ReentrantLock支持Condition 可以实现特定唤醒操作,Synchronized 要么唤醒一个或者所有都唤醒,这个特性对阻塞队列的性能影响很大。

ArrayBlockingQueue和LinkedBlockingQueue的区别

分析测试ArrayBlockingQueue和LinkedBlockingQueue的区别,得出结论如下: 1. 队列中锁的实现不同 ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁; LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock 2. 在生产或消费时操作不同 ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的; LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node《E》进行插入或移除,会影响性能 3. 队列大小初始化方式不同 ArrayBlockingQueue实现的队列中必须指定队列的大小; LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE 注意: 1. 在使用LinkedBlockingQueue时,若用默认大小且当生产速度大于消费速度时候,有可能会内存溢出 2. 在使用ArrayBlockingQueue和LinkedBlockingQueue分别对1000000个简单字符做入队操作时, LinkedBlockingQueue的消耗是ArrayBlockingQueue消耗的10倍左右, 即LinkedBlockingQueue消耗在1500毫秒左右,而ArrayBlockingQueue只需150毫秒左右。

BlockingQueue和List 有什么区别,BlockingQueue用在什么场景下

ueue的作用很多,比如说解耦。举个比较常见的例子: 某电商有交易和邮件两套系统,当一个交易完成时,给用户发一封确认邮件。这里交易系统和邮件系统显然是两个优先级的东西,交易系统要求很高的实时性,而邮件系统则不必,为了合理利用服务器资源,应当把这两套系统分离,合理的做法是,交易完成时,交易系统生成一个发邮件的任务,丢到queue中,而邮件系统监听在queue的另一端,用一个相对较低的速度处理queue中的发邮件任务。当然,这里的queue一般是mq或者activemq之类的产品。blockingqueue的作用本质上和他们类似。比如我们写个静态网页的爬虫,为了尽可能的高效率,应当把网络io和网站内容分析解耦,让更多的线程去处理较慢的网络io,把获取到的内容丢到queue中,用较少的线程处理速度较快的网页内容分析。至于为什么有arraylist还要用blockingqueue,这和有array了为什么还要有arraylist一样,为了方便呗,不信你自己用arraylist封装个能保证fifo,能保证线程安全的东西出来看下。

BlockingQueue可用于什么场合

BlockingQueue是一个由数组支持的有界阻塞队列,也就是说当一个线程向一个固定大小的BlockingQueue队列里面不停地存放数据,另一个线程不停的向这个队列里面取数据,如果队列满了,还继续存放数据,此时出现阻塞,直到队列有空闲的位置;反之,如果队列为空,还继续取数据,则会出现阻塞,直到队列中有数据为止

LinkedBlockingQueue和ArrayBlockingQueue的异同

分析测试ArrayBlockingQueue和LinkedBlockingQueue的区别,得出结论如下:

  • 队列中锁的实现不同

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

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

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

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

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

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

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

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

    注意:

  • 在使用LinkedBlockingQueue时,若用默认大小且当生产速度大于消费速度时候,有可能会内存溢出

  • 2.    在使用ArrayBlockingQueue和LinkedBlockingQueue分别对个简单字符做入队操作时,

  • LinkedBlockingQueue的消耗是ArrayBlockingQueue消耗的10倍左右,

  • 即LinkedBlockingQueue消耗在1500毫秒左右,而ArrayBlockingQueue只需150毫秒左右。

  • 多线程的队列blockqueue如何理解

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生不确定的结果。 LinkedBlockingQueue 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。

    BlockingQueue 怎么判断全部堵塞

    很简单啊, BlockingQueue中有个方法:  offer(anObject) 如果调用该方法,返回的是true,表示队列没有阻塞;如果返回的flase,则表示当前队列已满,全部阻塞了!

    关于JAVA BlockingQueue的工作原理

    BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。


    声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

    上一篇: ryu究竟是什么意思啊?街头霸王人物分析《RYU VS KEN》

    下一篇: 老茶梗是什么茶,老茶梗是什么茶树(还是没有茶梗的茶好呢)



    推荐阅读