[java][concurrent] CompletionService, BlockingQueue
2009-07-12 17:23:26| 分类:
lang_java
| 标签:
|举报
|字号大中小 订阅
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 元素。
评论这张
转发至微博
转发至微博
评论