开发一款开源爬虫框架系列(三):聊聊并发包中的队列(Queue)
2016-11-04 01:32
357 查看
爬虫开源项目地址:http://git.oschina.net/coliza/MongooCrawler
说到队列尤其是阻塞队列,不得不说jdk的并发包(java.util.concurrent)中的相关数据结构,今天我们就来对java(JDK1.7)中的队列做一个总结。
1、Queue
队列接口,定义了队列基本的接口方法
前两个方法是往队列塞数据,在队列空间不足的情况下add会抛出异常,而offer会返回false。poll和peek的区别是后者不会从队列中移除元素。
2、BlockingQueue、BlockingDequeue(阻塞队列、双向阻塞队列)
BlockingQueue扩展Queue的方法,使其在在队列已满的情况下添加元素时有了4种模式:其一,抛异常;其二,立即返回false;其三,等待;其四,等待一段时间。除此之外还增加了drainTo接口用于追加其它集合的元素到队尾
3、ArrayBlockingQueue、LinkedBlockingQueue
两者直接的最重要的区别就是前者使用了数组来存储元素,而后者使用Node(链式结构)来存储元素,其它方法和它们的父类差不多。inc和dec方法是用来检查边界的。此外按照集合类的惯例提供了一个迭代器内部类同时LinkedBlockingQueue还提供了一个从对象流中读写对象的方法。
4、TransferQueue、LinkedTransferQueue
这两个类比类似的集合类多了个Transfer的功能,这个功能会通过tryTransfer方法和transfer方法直接投递元素,而不会放入队列,区别在于前者如果没有对应等待的消费者会直接返回false后者会等待到消费者拿取元素。
5、PriorityBlockingQueue
值得提醒的一点是如果要保证这个Queue是按优先级来排列元素的,必须自己实现元素的CompareTo方法达到目的。
6、DelayedQueue
这个队列没太多可以介绍,它增加的功能就是能为元素设置一个失效时间,失效后才能被从队列中取出来。
7、SychronousQueue
这个队列的用处就是它只能有一个元素,取一个塞一个。
8、ConcurrentLinkedQueue和ConcurrentLinkedDeque
前面提到的queue都是非线程安全的queue,ConcurrentLinkedQueue是线程安全的类。那么问题来了,它是怎么实现线程安全的呢?首先它的head和tail节点都是使用关键字volatile保证了内存可见性,其次,阻塞队列使用了锁来实现阻塞功能,而并发阻塞队列的入队和出队操作使用CAS操作实现无所编程来达到同样目的,效率更高。
相关文章推荐
- 开发一款开源爬虫框架系列(二):设计爬虫架构
- 开发一款开源爬虫框架系列(四):设计fetcher
- 开发一款开源爬虫框架系列(一):分析nutch,scrapy的爬虫设计
- 开发一款开源爬虫框架系列(五):爬虫架构的一些新思路
- 基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之基础篇
- plain framework 1 一款主要用于网络(游戏)开发的C/C++开源框架 安装篇 updated
- 开源框架系列:.NET Enterprise CMS Framework --- RapidWebDev 快速开发产品管理示例程序
- java.util.concurrent系列之--并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源
- 推荐一款免费开源好用的移动混合开发框架
- 基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之前言篇
- plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源发布
- Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架
- Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架
- Workerman 一款纯PHP开发的开源高性能的PHP socket 服务器框架。
- 【开源】OSharp3.3框架解说系列:开发计划与进度
- 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)
- HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务
- 基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之基础篇
- 《开源合辑-(软件开发->框架)之(Delphi/Kylix)》 (3)