CompletionService接口相当于一个执行任务的工具,主要对获取任务执行结果进一步增强,方便获取已执行完的任务进行结果的下一步处理,解决各线程执行任务时间不确定时,ThreadPoolExecutor返回的Future对象不知道谁先能获取到执行结果进行下一步处理,避免主线程过长暂停时间。适用于执行一批任务并不断消费执行结果以及异步执行一批任务有一个任务完成则返回结果并取消其他任务(ExecutorService接口中已经提供了invokeAny方法更贴合此场景)的场景。
- 可使用submit方法传入Runnable或Callable参数提交任意多个任务;
- take方法可阻塞式的获取并移除一个最先执行完成的任务,支持响应中断并抛出异常重置中断标识;
- poll方法区别于take能立即响应,无已完成任务时立即返回null不阻塞;
- poll方法支持传入时间参数进行限时等待,限时等待方法支持响应中断并抛出InterruptException异常并重置中断标识;
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接口的具体实现为ExecutorCompletionService类,可通过构造方法传入一个线程池;内部维护了一个阻塞队列,任意一个任务执行完毕后会将执行结果(Future类型)放入阻塞队列中,其他线程可调用take或poll从阻塞队列中获取结果,返回结果的顺序和任务执行完成的先后顺序一致,所以能做到最先完成的任务最先返回。

307

被折叠的 条评论
为什么被折叠?



