【Java】juc中Executor框架及其基础结构详解之CompletionService接口和ExecutorCompletionService

CompletionService接口相当于一个执行任务的工具,主要对获取任务执行结果进一步增强,方便获取已执行完的任务进行结果的下一步处理,解决各线程执行任务时间不确定时,ThreadPoolExecutor返回的Future对象不知道谁先能获取到执行结果进行下一步处理,避免主线程过长暂停时间。适用于执行一批任务并不断消费执行结果以及异步执行一批任务有一个任务完成则返回结果并取消其他任务(ExecutorService接口中已经提供了invokeAny方法更贴合此场景)的场景。

  1. 可使用submit方法传入Runnable或Callable参数提交任意多个任务;
  2. take方法可阻塞式的获取并移除一个最先执行完成的任务,支持响应中断并抛出异常重置中断标识;
  3. poll方法区别于take能立即响应,无已完成任务时立即返回null不阻塞;
  4. 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;
«Interface»
CompletionService<V>
ExecutorCompletionService<V>

CompletionService接口的具体实现为ExecutorCompletionService类,可通过构造方法传入一个线程池;内部维护了一个阻塞队列,任意一个任务执行完毕后会将执行结果(Future类型)放入阻塞队列中,其他线程可调用take或poll从阻塞队列中获取结果,返回结果的顺序和任务执行完成的先后顺序一致,所以能做到最先完成的任务最先返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值