您的位置:首页 > 产品设计 > UI/UE

java concurent之BlockingQueue

2013-02-07 09:31 176 查看
从名字上看,BlockingQueue是阻塞队列的意思

这个队列主要提供下面的功能:

阻塞队列提供了可阻塞的take和put方法,另外可定时的poll和offer实际原理也是一样的。

如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。

阻塞队列有一般分为两类 无限阻塞队列和有限阻塞队列。有限阻塞队列中,当队列满时,调用put方法将会阻塞;而无限阻塞队列中,put方法是不会阻塞的。

很显然这个队列的一种最常用的场景就是 生产者-消费者 模式

它有以下具体实现类:

ArrayBlockingQueue:采用数组作为存储队列的阻塞队列,这个队列采用FIFO的方式管理数据

LinkedBlockingQueue:采用链式结构作为存储队列,同样它也采用FIFO的方式管理数据

PriorityBlockingQueue:采用基于优先级堆的极大优先级队列作为存储队列。

SynchronousQueue:特殊的BlockingQueue,其中每个 put 必须等待一个 take,反之亦然。

DelayQueue:这是一个无限阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部。

通过查看源代码可以看到这个类内部是采用PriorityQueue作为存储队列

DelayQueue的一些常用的场景

a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。

b) 缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。

c) 任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: