学习Java: Queue

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的


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建站手册-网站主机:电子商务主机

ylbtech-建站手册-网站主机:电子商务主机1.返回顶部 1、http://www.w3school.com.cn/hosting/host_ecommerce.asp2、2.返回顶部1、如果您的公司正在销售某种产品或服务,那么电子商务也许是做生意的一种好办法。 Internet 商业 电子商务就是在 Internet 上…

ConcurrentLinkedQueue

ConcurrentLinkedQueue 因为ConcurrentLinkedQueue是线程序安全的并且是针对并发的 主类 Java代码 public class conn{ public static void main(String[] args) throws Exception{ Queue<String> queuenew ConcurrentLinkedQueue<String>(); …

【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

每天学习一点点 编程PDF电子书、视频教程免费下载&#xff1a;http://www.shitanlife.com/code一、反向代理&#xff1a;Web服务器的“经纪人” 1.1 反向代理初印象 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;…

剖析java中的String之__拼接

剖析java中的String之__拼接 分类&#xff1a; java 2011-08-24 17:46 31人阅读 评论(0) 收藏 举报 出处, http://blog.csdn.net/izard999/article/details/6708433 网上剖析String的不少&#xff0c;关于其他的String的知识我就不累赘去说了&#xff01; 本文只解释下我在面…

mfc 弹簧_整合弹簧,速度和瓷砖

mfc 弹簧我喜欢 Tiles&#xff0c; 并且听到了很多有关 Velocity的信息 。 它们似乎有不同的用途&#xff0c;并且据说很容易结合在一起&#xff0c;所以我决定试一试&#xff0c;并在Spring Web应用程序中同时使用它们。 集成实际上花费了许多小时&#xff0c;并且是一次真正的…

STM32-RS485通信软硬件实现

OS&#xff1a;Windows 64 Development kit&#xff1a;MDK5.14 IDE&#xff1a;UV4 MCU&#xff1a;STM32F103C8T6/VET6 AD&#xff1a;Altium Designer 18.0.12 1、RS485简介  RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。RS485是一个定义平衡数字多点系统中的驱动…

MFC如何使控件大小随着对话框大小自动调整

MFC如何使控件大小随着对话框大小自动调整 2012-04-27 16:24:50| 分类&#xff1a; MFC | 标签&#xff1a; |字号大中小 订阅 对话框的大小变化后&#xff0c;假若对话框上的控件大小不变化&#xff0c;看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的…

Spring MVC整合Ehcache缓存框架

https://blog.csdn.net/u012562943/article/details/52289433转载于:https://www.cnblogs.com/pjlhf/p/8818747.html

Java 枚举7常见种用法

DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能&#xff0c;却给我的开发带来了“大”方便。 用法一&#xff1a;常量 在JDK1.5 之前&#xff0c;我们定义常量都是&#xff1a; publicstaticfianl....。现在好了&#xff0c;有了枚举&#xff0c;可以把相关的常…

Spring和Hibernate的自定义审核日志

如果您需要对所有数据库操作进行自动审核 &#xff0c;并且正在使用Hibernate…&#xff0c;则应使用Envers或spring data jpa auditing 。 但是&#xff0c;如果由于某些原因您不能使用Envers&#xff0c;则可以使用休眠事件侦听器和spring事务同步来实现类似的功能。 首先&a…

深度学习训练数据打标签过程

深度学习训练数据打标签过程 为了获取大量的图片训练数据&#xff0c;在采集数据的过程中常用视频的方式采集数据&#xff0c;但对于深度学习&#xff0c;训练的过程需要很多的有有标签的数据&#xff0c;这篇文章主要是解决视频文件转换成图片文件&#xff0c;并加标签&#x…

java 枚举学习--从小程序中学习

java 枚举学习--从小程序中学习 Java 枚举类型 解析 简介&#xff1a;java中枚举是一个类 用之前我觉得还是要知道应该何时使用&#xff1a; 一条普遍的规律是&#xff0c;任何使用常量的地方&#xff0c;例如目前使用的switch 代码切换的地方。 如果只是单独一个值&am…

《修改代码的艺术》读书笔记一

一、修改软件的起因及其本质。 修改软件是任何一个开发人员所面对的问题&#xff0c;软件是否容易修改&#xff0c;被修改后的软件是否变得更好&#xff0c;是每一个开发人员都知道必须关注但是在实际开发过程中却往往忽视的问题。有多少人在接手一个新项目时抱怨新项目的遗留代…

Java基础笔记 – 枚举类型的使用介绍和静态导入

Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由 arthinking 发表于404 天前 ⁄ Java基础 ⁄ 暂无评论 ⁄ 被围观 1,433 views 1、枚举&#xff08;Enum&#xff09;&#xff1a;JDK5.0中加入了枚举类型&#xff0c;使用enum关键字定义&#xff0c;可以按照如下定义&am…

spring自动装配依赖包_解决Spring自动装配中的循环依赖

spring自动装配依赖包我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践。 使用Spring编写企业Web应用程序时&#xff0c;服务层中的服务量可能会增加。 服务层中的每个服务可能会消耗其他服务&#xff0c;这些服务将通过Autowire注入。 问题&#xff1a;当服务数量…

Python中转换角度为弧度的radians()方法

Python中转换角度为弧度的radians()方法 这篇文章主要介绍了Python中转换角度为弧度的radians()方法,是Python入门中的基础知识,需要的朋友可以参考下 radians()方法把角度转化为弧度角x。 语法 以下是radians()方法的语法&#xff1a; radians(x) 注意&#xff1a;此函数是无…

如何招聘一个合格的程序员?

如何招聘一个合格的程序员&#xff1f; 发表于2012-12-03 16:29| 11559次阅读| 来源TheNextWeb| 23 条评论| 作者张祺 招聘程序员摘要&#xff1a;作者是ApeForest和ContentForest网站联合创始人Pravin Daryani。他在创办网站过程中&#xff0c;学习到了非常宝贵的经验教训。如…

JAXB和Log4j XML配置文件

Log4j 1.x和Log4j 2.x均支持使用XML文件来指定日志记录配置 。 这篇文章探讨了与使用JAXB通过Java类处理这些XML配置文件相关的一些细微差别。 本文中的示例基于Apache Log4j 1.2.17 &#xff0c; Apache Log4j 2.6.2和Java 1.8.0_73&#xff08;带有JAXB xjc 2.2.8-b130911.18…

(转载)浅谈线段树

浅谈线段树 数据结构——线段树 O、引例 A.给出n个数&#xff0c;n<100&#xff0c;和m个询问&#xff0c;每次询问区间[l&#xff0c;r]的和&#xff0c;并输出。 一种回答&#xff1a;这也太简单了&#xff0c;O&#xff08;n&#xff09;枚举搜索就行了。 另一种回答&…

双显示器设置:如何设置一台电脑两个显示器

双显示器设置&#xff1a;如何设置一台电脑两个显示器 -来源&#xff1a;互联网 作者&#xff1a;佚名 时间&#xff1a;04-11 09:00:18 【大 中 小】 点评&#xff1a;双显示器设置,如何设置一台电脑两个显示器&#xff1a;一般来说一台电脑通常只配一个显示器&#xff0c;在我…