java.util.concurrent
类 ExecutorCompletionService<V>
java.lang.Object
  继承者 java.util.concurrent.ExecutorCompletionService<V>
所有已实现的接口:
    CompletionService<V> 
    它实现了CompletionService接口,它使用在构造函数中提供的Executor来执行任务的。它会把完成了的任务放一个队列中, 外部可以通过take(),poll(),poll(long timeout,TimeUnit unit)来取得。该类非常轻便,适合于在执行几组任务时临时使用。
用法示例。 假定您有针对某个问题的一组求解程序,每个求解程序都能返回某种类型的 Result 值,
并且您想同时运行它们,使用方法 use(Result r) 处理返回非 null 值的每个求解程序的返回结果。
可以这样编写程序:

 void solve(Executor e,            Collection> solvers)     throws InterruptedException, ExecutionException {     CompletionService ecs         = new ExecutorCompletionService(e);     for (Callable s : solvers)         ecs.submit(s);     int n = solvers.size();     for (int i = 0; i < n; ++i) {         Result r = ecs.take().get();         if (r != null)             use(r);      }}

假定您想使用任务集中的第一个非 null 结果,而忽略任何遇到异常的任务,并且在 第一个任务完成时取消其他所有任务 :

void solve(Executor e,            Collection> solvers)     throws InterruptedException {     CompletionService ecs         = new ExecutorCompletionService(e);     int n = solvers.size();     List> futures         = new ArrayList>(n);     Result result = null;     try {         for (Callable s : solvers)             futures.add(ecs.submit(s));         for (int i = 0; i < n; ++i) {             try {                 Result r = ecs.take().get();                 if (r != null) {                     result = r;                     break;                              } catch (ExecutionException ignore) {}         }     }     finally {         for (Future f : futures)             f.cancel(true);     }

     if (result != null)         use(result); }}

主要构造函数
public   ExecutorCompletionService(Executor executor)
    使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将 LinkedBlockingQueue 作为完成队列。
    参数:
        executor - 要使用的执行程序 
    抛出:
        NullPointerException - 如果执行程序为 null
public  ExecutorCompletionService(Executor executor,BlockingQueue<Future<V>> completionQueue)
    使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将所提供的队列作为其完成队列。
    参数:
        executor - 要使用的执行程序
        completionQueue - 用作完成队列的队列,通常是专供此服务使用的队列 
    抛出:
        NullPointerException - 如果执行程序或 completionQueue 为 null

主要成员函数
public Future<V>  submit (Callable<V> task)
    从接口 CompletionService 复制的描述
    提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。在完成时,可能会提取或轮询此任务。
    指定者:
        接口 CompletionService<V> 中的 submit
    参数:
        task - 要提交的任务 
    返回:
        一个表示挂起的任务完成的 Future
public Future<V>  submit (Runnable task,V result)
    从接口 CompletionService 复制的描述
    提交要执行的 Runnable 任务,并返回一个表示任务完成的 Future,可以提取或轮询此任务。
    指定者:
        接口 CompletionService<V> 中的 submit
    参数:
        task - 要提交的任务
        result - 要返回的已成功完成任务的结果 
    返回:
        一个表示挂起的任务完成的 Future,其 get() 方法将返回完成时给出的结果值
public Future<V>  take()
               throws InterruptedException
    从接口 CompletionService 复制的描述
    获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
    指定者:
        接口 CompletionService<V> 中的 take
    返回:
        表示下一个已完成任务的 Future 
    抛出:
        InterruptedException - 如果在等待时被中断
public Future<V>  poll()
    从接口 CompletionService 复制的描述
    获取并移除表示下一个已完成任务的 Future,如果不存在这样的任务,则返回 null。
    指定者:
        接口 CompletionService<V> 中的 poll
    返回:
        表示下一个已完成任务的 Future;如果不存在这样的任务,则返回 null
public Future<V>   poll (long timeout,
                      TimeUnit unit)
               throws InterruptedException
    从接口 CompletionService 复制的描述
    获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则将等待指定的时间(如果有必要)。
    指定者:
        接口 CompletionService<V> 中的 poll
    参数:
        timeout - 放弃之前需要等待的时间长度,以 unit 为时间单位
        unit - 确定如何解释 timeout 参数的 TimeUnit 
    返回:
        表示下一个已完成任务的 Future;如果等待了指定时间仍然不存在这样的任务,则返回 null 
    抛出:
        InterruptedException - 如果在等待时被中断

ExecutorCompletionService相关推荐

  1. 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用...

    当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...

  2. ExecutorCompletionService原理具体解释

    在JDK并发包中有这么一个类ExecutorCompletionService,提交任务后,能够按任务返回结果的先后顺序来获取各任务运行后的结果. 该类实现了接口CompletionService: ...

  3. Future 和 ExecutorCompletionService 对比和使用

    附加:Java 4种线程池介绍请查看 谈谈new Thread的弊端及Java四种线程池的使用 当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可 ...

  4. ExecutorCompletionService 源码分析

    概要 在ExecutorService的submit方法中可以获取返回值,通过Future的get方法,但是这个Future类存在缺陷,Future接口调用get()方法取得处理后的返回结果时具有阻塞 ...

  5. ExecutorCompletionService分析及使用

    当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...

  6. java.util.concurrent.ExecutorCompletionService 源码

    2019独角兽企业重金招聘Python工程师标准>>> 线程池相关 源码: package java.util.concurrent;public class ExecutorCom ...

  7. 多线程处理容器ExecutorCompletionService使用

    一.多线程的好处: 唯品会供应链业务场景中,会涉及将多个部门接口聚合查询,一个采购订单创建过程中,可能需要调用外部接口10-600次来组装数据,此时用多线程,就可以缩减接口响应时间. 二.场景: 1. ...

  8. Solr初始化源码分析-Solr初始化与启动

    用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机 ...

  9. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

最新文章

  1. WPF DataGrid 绑定DataSet数据 自动生成行号
  2. WinAPI: PolyBezier - 绘制贝塞尔线
  3. 在C++中for、if...内定义的变量在其之外就失效了~
  4. 人类史上最大最好的希望事件
  5. boost::subgraph用法的测试程序
  6. 解题报告——例题5-5 集合栈计算机 UVa12096
  7. [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
  8. 怎样快速学会python_python入门如何更快的学习
  9. 《Effective Java》第5条:避免创建不必要的对象
  10. keepalived 邮件通知
  11. PLC梯形图编程入门
  12. Unity中,图片 替换 光标 —— 疑问解答
  13. null object java_java1.8--Null Object模式
  14. macbook用户注意了,这个行为可能导致显示屏损坏
  15. stm32 带通滤波器_PCB设计中建立带通滤波器波特图
  16. Sort exceeded memory limit of 104857600 bytes 解决方案
  17. 【BZOJ 3993】【SDOI 2015】星际战争
  18. 京东智联云能打破“强者恒强”的定律吗?
  19. 微信怎样操作开启微信运动?技巧经验!微信中如何去设置微信运动记录运动步数?
  20. MySQL自定义中文转拼音函数

热门文章

  1. JQuery自定义属性的设置和获取
  2. Mac蒲公英sh脚本上传app
  3. 实战项目之基于flask的及时聊天系统
  4. 使用jQuery完成下拉菜单
  5. 比 Xshell 还好用的 SSH 客户端神器!
  6. 对传统优化算法的一些总结(上)
  7. 如何正确理解开漏输出和推挽输出
  8. 我就是那个错过了乔布斯的变态老码农
  9. Windows下 wget 的安装与使用
  10. 机器学习——朴素贝叶斯分类