登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[java][concurrent] CompletionService, BlockingQueue  

2009-07-12 17:23:26|  分类: lang_java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
CompletionService 用于配合 AbstractExecutorService 来实现“任务完成的通知”。
而 BlockingQueue 用于实现不同策略的 CompletionService。

----------------------------------------------------------------------------

CompletionService<V>  <-- ExecutorCompletionService<V>

-- CompletionService --
负责检查 task 是否完成的检查器。CompletionService 还是依赖 Executor.execute() 来执行任务。
submit(),提交任务。
poll(), 检查是否有任务完成,无论是否有,都理解返回。
take(), 检查是否有任务完成,block住,直到任何一个任务完成为止。

-- ExecutorCompletionService --
CompletionService 的唯一实现。使用 BlockingQueue 来实现 submit/poll/take。
而 BlockingQueue 本身并不知道 task 是被谁执行的,BlockingQueue 只管理 futures 啥时候完成。

----------------------------------------------------------------------------

                                   |--- ArrayBlockingQueue
BlockingQueue   <--+--- LinkedBlockingQueue
      |                            |--- PriorityBlockingQueue
      |                            |--- DelayQueue
      |                            |--- SynchronousQueue
      |
BlockingDeque   <------ LinkedBlockingDeque

-- BlockingQueue --
定义了支持 offer/poll, put/take 这样“立即返回”or“Block”两种要求的接口。
Throws exception, 是 Collection 原有接口的实现。
Special value, 是尝试并立即返回。
Blocks, 则是调用,block住,等到有“满足条件的元素”时,才返回。

                  |     Throws exception    Special value        Blocks        Times out
--------------+-----------------------------------------------------------------------------------------
Insert         |     add(e)                       offer(e)                  put(e)          offer(e, time, unit)
Remove    |     remove(o)                 poll()                      take()          poll(time, unit)
Examine   |     element()                   peek()                   -                   -

ArrayBlockingQueue, 通过 array 实现的 FIFO-queue,最大可容纳的元素数量在 queue 创建时就决定了,不会动态改变。
LinkedBlockingQueue, 通过 linked-list 实现的 FIFO-queue,最大可容纳数量不限。
PriorityBlockingQueue, 根据创建时的  Comparator 来决定元素出queue的顺序。
DelayQueue, 只接受实现了 Delayed接口 的元素。出queue顺序由 delay time 决定,越短的约先出来。
SynchronousQueue, 只有 take/put 两个接口有意义。put() 后,只有等到另一个线程 take() 后,才会 put() 才会返回。同理,若先 take() 则需要等某个线程 put() 后,take() 才返回。ps. 实现里面用了 CAS intr 作了个 dual stack/queue,比较有意思。

Deque 版本就是扩展了下 Queue,可以在 head/tail 双向 put/take 元素。
  评论这张
 
阅读(1223)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018