CompletionService接口源码重点
- CompletionService接口是用于将新异步任务的创建与获取已完成任务的结果分离的服务,生产者submit要执行的任务。使用者take获取已完成的任务的Future,并按完成的顺序处理其结果
- 可以调用Future的get方法获取任务执行的结果
- take是阻塞的方法阻塞直到获取一个已完成任务的Future,而poll方法是非阻塞的,如果此时没有任务完成,则直接返回null,poll(long timeout, TimeUnit unit)是会超时的阻塞,即阻塞给定超时时间,如果超时则返回null,在超时时间内有任务完成返回Future
- 内存一致性:任务提交submit先于该任务被执行,而该任务被执行又先于take获取结果
CompletionService接口方法
| 方法名 | 作用 |
|---|---|
| Future submit(Callable task); | 提交一个任务以供执行,Callable里面的call方法就是要执行的任务,并返回一个Future用于获取任务执行结果,结果是call方法返回的结果 |
| Future submit(Runnable task, V result) | 提交一个任务以供执行,Runnable里面的run方法就是要执行的任务, 并返回一个Future用于获取任务执行结果,执行结果是传入的 result |
| Future take() | 获取并删除表示下一个已完成任务的Future,如果还没有,则阻塞等待 |
| Future poll() | 获取并删除表示下一个已完成任务的Future,不阻塞,如果没有返回null |
| Future poll(long timeout, TimeUnit unit) | 获取并删除表示下一个已完成任务的Future,只阻塞给定的超时时间,如果超时返回null |
CompletionService接口源码
package java.util.concurrent; public interface CompletionService{ Future submit(Callable task); Future submit(Runnable task, V result); Future take() throws InterruptedException; Future poll(); Future poll(long timeout, TimeUnit unit) throws InterruptedException; }



