15 08, 2007

学习Java: Queue

Java — 作者 zybing @ 15:17
Java提供了Quere,相当好用,在1.5版本中又有增强。

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构

offer,add区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll,remove区别:
remove() 和 poll() 方法都是从队列中删除第一个元素(head)。remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

-----------------------------------------------------------------------------------------
Tiger中有2组Queue的实现:实现了新的BlockingQueue接口的
和没有实现的

-------------------------------------------------------------
没有实现的阻塞接口的:LinkedList: 实现了java.util.Queue接口
java.util.AbstractQueue
内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue

PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。

PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。

ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大小,ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

------------------------------------------------------------------
实现阻塞接口的:

新的 java.util.concurrent 包在 Collection Framework 中可用的具体集合类中加入了 BlockingQueue 接口和五个阻塞队列类。

它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。

五个队列所提供的各有不同:

* ArrayBlockingQueue :一个由数组支持的有界队列。
* LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
* PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
* DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
* SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

前两个类 ArrayBlockingQueueLinkedBlockingQueue 几乎相同,只是在后备存储器方面有所不同, LinkedBlockingQueue 并不总是有容量界限。无大小界限的 LinkedBlockingQueue 类在添加元素时永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE 元素之前不会)。

PriorityBlockingQueue 是具有无界限容量的队列,它利用所包含元素的 Comparable 排序顺序来以逻辑顺序维护元素。可以将它看作 TreeSet 的可能替代物。不过对 PriorityBlockingQueue 有一个技巧。从 iterator() 返回的 Iterator 实例不需要以优先级顺序返回元素。如果必须以优先级顺序遍历所有元素,那么让它们都通过 toArray() 方法并自己对它们排序,像 Arrays.sort(pq.toArray())。

新的 DelayQueue 实现可能是其中最有意思(也是最复杂)的一个。加入到队列中的元素必须实现新的 Delayed 接口(只有一个方法 —— long getDelay(java.util.concurrent.TimeUnit unit) )。因为队列的大小没有界限,使得添加可以立即返回,但是在延迟时间过去之前不能从队列中取出元素。如果多个元素完成了延迟,那么最早失效/失效时间最长的元素将第一个取出。实际上没有听上去这样复杂。

SynchronousQueue 类是最简单的。它没有内部容量。它就像线程之间的手递手机制。在队列中加入一个元素的生产者会等待另一个线程的消费者。当这个消费者出现时,这个元素就直接在消费者和生产者之间传递,永远不会加入到阻塞队列中。

----------------------------------------------
实验结果:

文档说BlockingQueue的队列: 不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。

实验了一下,使用put、take是这样子的,线程在等待
而使用offer是立刻返回false的

学习Java: Queue相关推荐

  1. 学习Java编程培训的书籍有哪些

    学习java技术除了线上线下的培训学习,书籍的知识也是非常重要的,今天小编为大家整理的就是学习Java的一些书籍,Java书籍是程序员学习提升技能的重要学习渠道,通过书籍Java程序员可以学习当前流行 ...

  2. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  3. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

  4. 在线学习Java编程的最佳方法

    1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好消息是,您可以在线找到 ...

  5. 秋招来袭,想学习Java进大厂的小伙伴,这7点武林秘籍一定要点开看看!(附一线互联网大厂MySQL面试高频考点)

    转眼间六月已经过了十天了.六月虽是盛夏,但秋招也不远了.提早做好准备才能在实战中游刃有余. 今天整理更新一篇Java学习分阶段路线攻略.希望能给大家一些启发,找到一条属于自己的学习线路. 本文为转载. ...

  6. 即将实习的应届毕业生 学习java SpringMVC 数据库 知识总结

    即将实习的应届毕业生 学习java SpringMVC 数据库 知识总结 1.Java语言的优点: 1)Java是纯面向对象语言 2)与平台无关性,一次编译到处运行 3)Java提供了狠多内置类库 4 ...

  7. java安装_在线学习Java编程的最佳方法

    java安装 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好消息是,您 ...

  8. 【经验分享】学习Java的好书有哪些?Java书籍清单

    Java书籍是程序员学习提升技能的重要学习渠道,通过书籍Java程序员可以学习当前流行.重要的相关技能.经典的书经受时间的考验,随着岁月的流逝变得越来越重要,让我们不断的学习和进步. 为了帮助大家更轻 ...

  9. Java学习路线图,如何学习Java事半功倍?

    作为一个初学者想掌握Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确的告诉你学习这事本来 ...

最新文章

  1. win10 自待wmi应用 查询wmi
  2. php ssh2函数,SSH2 函数 - PHP 7 中文文档
  3. Hystrix使用与分析
  4. datagrid 重载本地数据_音视频系列3:使用ffmpeg + nginx搭建本地转发服务器
  5. 3月第4周全球域名商TOP15:万网第四 涨幅居亚
  6. linux 命令 抛后台,在后台运行Linux命令的方法
  7. @Inner使用及原理
  8. 11组软件工程组队项目失物招领系统——界面设计文档
  9. Xamarin University-----Xamarin Mobile Certification Exam考试经历(还没写完)
  10. 计算机网络中的mac全称,计算机网络中MAC地址与IP地址
  11. 认证通用基础相关标准和法规
  12. 毕业设计,人脸识别系统
  13. python解析pdf乱码,python pdfkit 中文乱码问题的解决方案
  14. 微信公众号小程序怎么做 微信公众号小程序制作教程
  15. 关于为了吃瓜通宵7天写了一个网站却没钱买域名这件小事
  16. 如何解决eclipse桌面快捷方式无法打开,jre or jkd的问题
  17. Cadence Allegro学习之查询命令+测量长度
  18. 【LeetCode】934. Shortest Bridge 解题报告(Python)
  19. 阿里程序员常用的 15 款开发者工具
  20. 关于互联网公司的加班制度,我想说点心里话

热门文章

  1. tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...
  2. 【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细
  3. Memobus总线光端机产品功能介绍
  4. 【渝粤题库】陕西师范大学164117 企业组网技术 作业 (高起专)
  5. zigbee工业应用技术
  6. android 剪切板广播发送者,Android使用剪切板传递数据
  7. android动态添加的页面怎么加功能_Android跳转应用安装页面
  8. python怎么把数据写进txt_python 如何将数据写入本地txt文本文件的实现方法
  9. nginx php环境搭建_php+nginx环境配置
  10. python神经网络教程16_Python深度学习之神经网络视频