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. 真香,理解记忆法学习Python基础语法

    这篇文章很难写!我最开始学 Python,和大多数人一样,是看的菜鸟教程: 在写完这篇文章的第一遍后,我发现并没有写出新意,很可能读者看到后,会和我当初一样,很快就忘了.我现在已经不是读者而是作者了, ...

  2. 理解记忆三种常见字符编码:ASCII, Unicode,UTF-8

    理解什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是25 ...

  3. ajax获取数据的形象比喻,助于理解记忆

    过程 创建对象(打开浏览器) 连接服务器(输入网址) 发送请求(按下回车) 服务器接收并返回数据(显示对应的网址网站内容) 原理

  4. Array.splice()理解记忆

    var arr = [0,1,2,3,4,5,6,7,8,9]; arr.splice(0,0,"添加项1"); //arr => ["添加项",0,1, ...

  5. 浅谈Js原型的理解

    一.js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了!    在参考了多方面的资料后,发现解释都太过专业,对于很多还没有接触过面向对象    语言的小白来说,有理解不了里面的专有名词!如果你没 ...

  6. JavaScript 对象的创建和对6种继承模式的理解和遐想

      JS中总共有六种继承模式,包括原型链.借用构造函数.组合继承.原型式继承寄生式继承和寄生组合式继承.为了便于理解记忆,我遐想了一个过程,对6中模式进行了简单的阐述. 很长的一个故事,姑且起个名字叫 ...

  7. js的面向对象的程序设计之理解继承

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(六) 先来解析下标题——对象和继承~ 一.对象篇 ECMA-262把对象的定义为:&qu ...

  8. cookie和session的个人理解

    这是我学习后的个人理解  欢迎提点 如果说的不是很正确请纠正 COOKIE: 1.服务端给浏览器客户端返回一个编号(COOKIE值) 2.这个值存在浏览器中,接下来浏览器再次访问我的时候,会把这个值带 ...

  9. 37.js----浅谈js原型的理解

    浅谈Js原型的理解 一.js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了!    在参考了多方面的资料后,发现解释都太过专业,对于很多还没有接触过面向对象    语言的小白来说,有理解不了里面 ...

随机推荐

  1. 冒泡排序_python

    def popdata(ls): for i in range(len(ls)): for j in range(i+1,len(ls)): if ls[i]>ls[j]: # tmp=ls[i ...

  2. Linux(CENTOS7) NodeJs安装

    1.下载NodeJs 官网下载地址:http://nodejs.cn/download/ ​ 2.上传到linux系统 我这里上传到/disk/nodejs目录下面的,上传工具使用的xftp. ​ 3 ...

  3. github访问过慢解决

    为了更加愉快地使用全球最大同性交友网站上的优质资源,我们来做一些简单的本机上的调整. 通过查看下载链接,能够发现最终被指向到Amazon的服务器(http://github-cloud.s3.amaz ...

  4. OpenMP笔记(四)

    个人博客地址:http://www.bearoom.xyz/2019/02/22/openmp4/ 一.private private子句用于将一个或多个变量声明成线程私有的变量,这样每个线程都有该变 ...

  5. JavaScript数组去重(5种方法)

    // 数组去重 let arr = ['a', 'b', 'b', 1, 1, 'true', true, true, NaN, NaN, 'NaN', undefined, undefined, n ...

  6. ServiceComb 集成 Shiro 实践|火影专场发布

    Shiro简介 Apache Shiro是一款功能强大.易用的轻量级开源Java安全框架,它主要提供认证.鉴权.加密和会话管理等功能.Spring Security可能是业界用的最广泛的安全框架,但是 ...

  7. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  8. PAT甲级——1061 Dating (20分)

    Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2984akDfkkkkg ...

  9. [HEOI2013]ALO(可持久化Trie+链表)

    你永远不会相信一个快AFO的选手不会可持久化Trie. 其实异或粽子那题可以用可持久化Trie做,不过我还是没用,用的一般的Trie(其实可持久化是多此一举),于是到现在还是不会可持久化Trie. 这 ...

  10. 剑指offer【11】- 矩形覆盖

    题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 在分析前不知道是什么序列,所以先看了n=1,n=2,n=3,n= ...