Java基础-线程-ExecutorCompletionServ
2020-02-28 本文已影响0人
16325
ExecutorCompletionService
CompletionService 方法,分别如下:
Future submit(Callable task);
submit 用于提交一个 Callable 对象,用于提交一个可以获得结果的线程任务
Future submit(Runnable task, V result);
submit 用于提交一个 Runnable 对象及 result 对象,类似于上面的 submit,但是 runnable 的返回值 void 无法获得线程的结果,所以添加了 result 用于做为参数的桥梁
Future take() throws InterruptedException;
take 用于取出最新的线程执行结果,注意这里是阻塞的
Future poll();
take 用于取出最新的线程执行结果,是非阻塞的,如果没有结果就返回 null
Future poll(long timeout, TimeUnit unit) throws InterruptedException;
同上,只是加了一个超时时间
另外,CompletionService 是接口,无法直接使用,通常使用他的实现类 ExecutorCompletionService
可能看到这里会很好奇 ExecutorCompletionService 实现原理,其实原理很简单,他在内部维护了一个阻塞队列,提交的任务,先执行完的先进入队列,所以你通过 poll 或 take 获得的肯定是最先执行完的任务结果。
用处:多个线程,先执行完的进阻塞队列,然后可以按执行顺序获取结果