java.util.concurrent.CompletionService<V>

原创
2014/06/20 23:35
阅读数 173

这个Service咋一看和ExecutorService(点击查看源码)非常像,但是仔细一看又有点不一样?为什么都是执行框架,但是ExecutorService却继承了Executor(点击查看源码)而CompletionService却没有?

上源代码:

package java.util.concurrent;

public interface CompletionService<V> {
    
    Future<V> submit(Callable<V> task);

    Future<V> submit(Runnable task, V result);

    Future<V> take() throws InterruptedException;

    Future<V> poll();

    Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;
}

CompletionService 主要将提交的各个任务,放入了阻塞队列。并提供了阻塞式的和非阻塞式的任务结果消费方法。submit方法可以认为是生产者的提交方法,而take, poll则是消费者的取出方法。关于生产者消费者


Future<V> submit(Callable<V> task);

    Future<V> submit(Callable<V> task);

参数: Callable(点击查看源码) 任务

返回:Future(点击查看源码)返回一个将来的结果

解读:提交一个可执行的任务,并获得返回。


Future<V> submit(Runnable task, V result);

同上


Future<V> take() throws InterruptedException;

Future<V> take() throws InterruptedException;

返回:Future(点击查看源码)返回一个将来的结果

解读:从完成队列里获取一个返回并且从队列里删除,如果队列为空,那么将一直等待。


Future<V> poll();

Future<V> poll();

返回:Future(点击查看源码)返回一个将来的结果

解读:从完成队列里获取一个返回并且从队列里删除,如果队列为空,那么将返回null。


Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;

Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;

参数:等待的时间和时间单位

返回:Future(点击查看源码)返回一个将来的结果

解读:从完成队列里获取一个返回并且从队列里删除,如果队列为空,那么等待一段时间,如果仍然没有则返回null。

异常:在等待过程中,如果线程被中断了,那么抛出InterruptedException



其实看到这里,ExecutorService和CompletionService的不同已经非常明显了,ExecutorService关注的是执行的生命周期而CompletionService是关注执行与结果的发生。

在实现CompletionService接口时,有两种路径 CompletionService -> ExecutorService -> Executor 或者 CompletionService -> Executor

区别在于是否有对生命周期的管理的需求。那么如何实现这两种不同的ConpletionService呢?且看下篇。



展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部