序言
使用ExecutorService时候,我们只是向其中不断提交任务,然后通过Future获取get任务结果,但是有时候get需要等待,虽然可行,但是比较繁琐,可以有更好的方式,比如CompletionService实现了将完成的任务放在完成队列中,使得获取任务结果可以向队列一样通过take和poll任务结果,这样比ExecutorService更加方便。CompletionService通过ExecutorCompletionService实现,这两个实现均非常简单。
结构
通过类图,可以看出CompletionService并没有继承ExecutorService,而是内部包含了AbstractExecutorService类,CompletionService和ExecutorService比较类似地方是都有submit方法,而CompletionService获取执行结果是根据take和poll的方式去获取。
API
实现
任务结果排队的QueueingFuture
1 | //全部final,说明在构造函数里面会创建好这些实例变量 |
构造函数
1 | public ExecutorCompletionService(Executor executor) { |
1 | public ExecutorCompletionService(Executor executor, |
提交任务submit
提交任务和AbstractExecutorService类似,只不过提交的是返回结果排队的QueueingFuture.
1 | public Future<V> submit(Callable<V> task) { |
从阻塞队列获取任务结果take,poll
1 | //如果没有完成的任务会阻塞等待 |