`

CompleteService介绍和使用实例

阅读更多

当向Executor提交批处理任务时,并且希望在它们完成后获得结果,如果用FutureTask,你可以循环获取task,并用future.get()去获取结果,但是如果这个task没有完成,你就得阻塞在这里,这个实效性不高,其实在很多场合,其实你拿第一个任务结果时,此时结果并没有生成并阻塞,其实在阻塞在第一个任务时,第二个task的任务已经早就完成了,显然这种情况用future task不合适的,效率也不高的,实例如下:

 

实例一:用一个非complete Service完成的批量任务

package completeservice;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;


/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-11
 *
 **/

public class NonCompleteServiceTest {
   
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        Future<String>[] futures = new FutureTask[10];
       
        /**
         * 产生一个随机数,模拟不同的任务的处理时间不同
         */
        for (int i = 0; i < 10; i++) {
            futures[i] = executorService.submit(new Callable<String>() {
                public String call(){
                    int rnt = new Random().nextInt(5);
                   
                    try {
                        Thread.sleep(rnt*1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("run rnt = "+rnt);
                    return String.valueOf(rnt*1000);
                }
            });
        }
       
        /**
         * 获取结果时,如果任务没有完成,则阻塞,在顺序获取结果时,
         * 可能别的任务已经完成,显然效率不高
         */
        for (int i = 0; i < futures.length; i++) {
            System.out.println(futures[i].get());
        }
        executorService.shutdown();
    }

}

 

package completeservice;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-11
 *
 **/

public class CompleteServiceTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
    ExecutorService executorService = Executors.newFixedThreadPool(10);
   
   
    CompletionService<String> completionService = new ExecutorCompletionService<String>(executorService);
   
    /**
     * 产生一个随机数,模拟不同的任务的处理时间不同
     */
    for (int i = 0; i < 10; i++) {
        completionService.submit(new Callable<String>() {
            public String call(){
                int rnt = new Random().nextInt(5);
               
                try {
                    Thread.sleep(rnt*1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("run rnt = "+rnt);
                return String.valueOf(rnt*1000);
            }
        });
    }
   
    /**
     * 获取结果时,总是先拿到队列上已经存在的对象,这样不用依次等待结果
     * 显然效率更高
     */
    for (int i = 0; i < 10; i++) {
        Future<String> future = completionService.take();
        System.out.println(future.get());
    }
    executorService.shutdown();
}
}

 

 

分享到:
评论
1 楼 coolboyysy 2013-07-23  

相关推荐

    oracle删除和重建实例

    在这篇文章中,我们将介绍删除和重建 Oracle 实例的步骤和要点。 删除 Oracle 实例 删除 Oracle 实例是一个复杂的过程,需要遵循一定的步骤,以免出现意外错误。下面是删除 Oracle 实例的步骤: 1. 删除实例记录...

    Openairinterface项目介绍以及使用实例

    Openairinterface项目介绍以及使用实例,个人根据工作经验和需求,对Openairinterface项目进行了介绍,主要包括项目的功能和历史,并对5G研究做了概述。

    LMS imagine.Lab AMESim系统建模和仿真实例教程

    付永领、齐海涛编著的《LMS Imagine.Lab AMESim系统建模和, 仿真实例教程》以“实例教程”的方式介绍了AMESim在UNIX工作站和个人, 计算机上的使用方法。全书共10章,主要内容包括初级实例、高级实例分, 析,高级特点...

    OpenStack web界面使用ISO镜像安装启动实例

    本文将深入探讨如何通过Horizon使用ISO镜像来安装和启动一个新的实例。 首先,ISO镜像是一个标准的光盘映像格式,通常用于存储软件安装程序,如操作系统。在OpenStack中,ISO镜像可以作为启动源,让用户能够像在...

    QT5开发及实例配套源代码.zip

    Qt是诺基亚公司的C++可视化开发平台,本书以Qt 5作为平台,每个章节在简单介绍开发环境的基础上,用一个小实例,介绍Qt 5应用程序开发各个方面,然后系统介绍Qt 5应用程序的开发技术,一般均通过实例介绍和讲解内容...

    Visual C# .NET精彩编程实例集锦

    实例1 如何使用错误提醒控件 实例2 如何使用信息提示控件 实例3 如何使用菜单控件 实例4 如何使用工具栏控件 实例5 如何使用状态栏控件 实例6 如何使用托盘控件 实例7 如何使用标签页控件 实例8 如何使用进度条控件 ...

    欧姆龙PLC的FINS通讯手册与使用实例解析

    这份资源集合了FINS通讯手册、FINS命令协议以及丰富的使用实例,旨在帮助用户理解和掌握如何高效地与欧姆龙可编程控制器(PLC)进行数据交换。 FINS(Fieldbus Network System)是欧姆龙公司开发的一种网络通信协议...

    sqlserver2008R2应用添加实例步骤

    - 使用实例名称和之前设置的登录凭证进行连接,以验证是否成功。 **步骤9:数据库还原** - 如果需要将现有的数据库还原到新实例中,请确保数据库名称保持不变。 - 使用SSMS或其他工具将数据库文件导入新实例,并...

    j2ee实例 j2ee实例j2ee实例

    在实例中,了解如何使用JNDI查找和注入依赖,可以提高代码的可扩展性和灵活性。 此外,安全是J2EE应用的重要组成部分。J2EE提供了一套强大的安全模型,包括角色基的安全性、SSL/TLS加密、容器管理的身份验证和授权...

    UDP实例和SPComm实例

    用Delphi开发的SPComm和UDP的使用实例

    C# WebSocket使用实例源码,包含服务端和客户端

    总的来说,这个"C# WebSocket使用实例"是一个很好的学习资源,它涵盖了WebSocket的基本概念和C#实现细节。通过研究和运行这个示例,开发者可以更好地理解和掌握WebSocket在实际项目中的应用,特别是在需要实时数据...

    VC++开发400实例

    VC++开发 400实例 有说明文档 有目录 对出行者:很全 很实用 第1章 实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 ... 实例020——使用CStringArray类创建和使用字符串数组 实例021

    linux下oracle安装两个实例一个监听的配置

    本文将详细介绍如何在Linux下为两个Oracle实例配置一个监听器的过程,包括关键配置文件`listener.ora`和`tnsnames.ora`的设置。 ### 一、理解监听器与实例的关系 监听器是Oracle数据库中的一个重要组件,它负责...

    伪代码实例介绍-规则与实例

    通过这些实例,学习者可以了解如何使用伪代码来解决实际问题,熟悉其结构和逻辑,为后续的编程实现打下坚实基础。在编写伪代码时,应保持清晰和一致的风格,确保每个步骤都能准确地映射到实际的编程实现中。同时,伪...

    labview55个经典实例

    12. **子VI和函数库**:通过创建子VI,可以实现代码重用和模块化,实例将展示如何创建和使用子VI。 13. **数据可视化**:LabVIEW强大的图表和图形功能会在实例中得到体现,如实时波形显示、数据统计图、3D图形等。 ...

    php+redis使用实例

    该文档是php+redis的简单实例,主要使用了get和set方法

    100个C#初学者编程实例

    10. **LINQ查询**:学习使用Language Integrated Query(LINQ)可以更高效地处理数据,实例会介绍如何使用LINQ进行数据库查询、集合筛选等操作。 11. **多线程**:C#支持并发编程,通过Thread类和Task类,初学者...

Global site tag (gtag.js) - Google Analytics