completion services是一个java.util.concurrent.CompletionService<V>接口的应用,这个是从同步任务和从任务完成的返回结果中解耦。V是任务返回的类型。

一个生产者提交一个任务执行(通过一个工作线程),通过请求一个submit()方法:一个方法接受可调用的参数和一个方法接受运行中的参数随后结果返回任务的完成。为了任务的完成,你可以从池中请求poll()的方法或请求阻塞的take()方法。

一个消费者从请求take()的方法中获取一个完成的任务。这个方法会阻塞直到一个任务的完成。它会返回一个Future<V>的对象,代表任务完成。你可以请求Future<V>的get()方法去包含这个结果。

与之关联的CompletionService<V>,Java7介绍了java.util.concurrent.ExecutorCompletionService<V>类,这个类提供任务执行通过一个提供的执行器。这个类确保,当提交的任务已经完成,它们将会放置在队列take()中。

为了演示CompletionService和ExecutorCompletionService,我重新写了一个应用去计算Euler的数,这个在第五章节已经写过。Listing 8-8出现的资源代码是一个新的应用,通过两个随时可以调用任务去精确计算数字。

Listing 8-8package com.owen.thread.chapter8;import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CSDemo
{public static void main(String[] args) throws Exception{ExecutorService es = Executors.newFixedThreadPool(10);CompletionService<BigDecimal> cs = new ExecutorCompletionService<BigDecimal>(es);cs.submit(new CalculateE(17));cs.submit(new CalculateE(170));Future<BigDecimal> result = cs.take();System.out.println(result.get());System.out.println();result = cs.take();System.out.println(result.get());es.shutdown();}
}class CalculateE implements Callable<BigDecimal>
{final int lastIter;public CalculateE(int lastIter){this.lastIter = lastIter;}@Overridepublic BigDecimal call(){MathContext mc = new MathContext(100, RoundingMode.HALF_UP);BigDecimal result = BigDecimal.ZERO;for (int i = 0; i <= lastIter; i++){BigDecimal factorial = factorial(new BigDecimal(i));BigDecimal res = BigDecimal.ONE.divide(factorial, mc);result = result.add(res);}return result;}private BigDecimal factorial(BigDecimal n){if (n.equals(BigDecimal.ZERO))return BigDecimal.ONE;elsereturn n.multiply(factorial(n.subtract(BigDecimal.ONE)));}}

Listing8-8出现两个类:CSDemo和CalculateE.CSDemo运行这个应用和CaculateE描述一个Euler数字计算的任务。
      CSDemo的main()方法第一次创建一个执行器服务,它将会执行一个任务。它创建一个completion service去完成任务。两个计算任务随后提交到completion service,这将会返回每一个同步的任务。对于每一个任务,completion service的take()方法被请求,并且返回一个任务的结果,谁调用get()的方法将会包含任务的结果,它会输出信息。
      Calculate包含的代码与第五章节的相似,唯一不一样的是改变一个LASTITER不间断地变化到lastIter的变量,记录着最后一个迭代器的执行(和确定精度的位数)。
      执行上面的代码,你可能得到如下的结果:

2.7182818284590450705160477958486050611789796352510326989007350040652250425048433140558879743442457417300394540627112.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274638961162816541248130487298653803083054255628382459134600326751445819115604942105262868564884769196304284703491677706848122126664838550045128841929851772268853216753574895628940347880297133296754744949375835005542283846314528419863840501124972044069282255484327668062074149805932978161481951711991448146506

Note  如果你关于执行服务(executorservice)和完成服务(completion service)存在疑惑,思考这个,一个执行服务,在写所写的代码需要提交任务,你需要去写代码去有效地获取任务的结果返回;对于一个完成服务,这项目工作是完全自动的。其它方式去看这个两的区别,一个执行服务提供进入队列给任务,和提供工作线程;而一个完成服务提供一个进入队列人任务、工作线程和一个输出队列去储存任务结果。

8.4完成服务(Completion Services)相关推荐

  1. 用C#创建Windows服务(Windows Services)

    转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...

  2. C# windows服务:创建Windows服务(Windows Services)的一般步骤

    C#创建Windows服务(Windows Services) Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Wind ...

  3. (转)创建Windows服务(Windows Services)N种方式总结

    转自:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html 最近由于工作需要,写了一些windows服务程序,有一些经验,我现在 ...

  4. 配置使用P6(EPPM) 定时服务(Job Services)

    Table of Contents Configuring a Job Services Server Using p6services.jar Configuring a Job Services ...

  5. *用C#创建Windows服务(Windows Services)

    Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Win ...

  6. 终端服务(Terminal Services)简介

    终端服务是在Windows NT中首先引入的一个服务.终端服务使用RDP协议(远程桌面协议)客户端连接,使用终端服务的客户可以在远程以图形界面的方式访问服务器,并且可以调用服务器中的应用程序.组件.服 ...

  7. Mac 重启服务→services

    Mac 重启服务 查看服务 brew services list ☁ 7.4 brew services list 19968 Name Status User File dnsmasq stoppe ...

  8. node seneca_使用Node.js和Seneca编写国际象棋微服务,第1部分

    node seneca (This is Part 1 of a three-part series [Part 2, Part 3]) (这是一个由三部分组成的系列文章的第1部分[ 第2 部分 , ...

  9. [转]使用批处理设置、启动和停止服务

    使用批处理设置.启动和停止服务                                                              Pashine     当我们的电脑安装了数据 ...

  10. [RHEL5企业级Linux服务攻略]--第3季 DHCP服务全攻略

    1 DHCP原理  1.1 DHCP概述 DHCP(Dynamic Host Configuration Protocal)就是动态主机配置协议哈,可以自动配置主机的IP地址.子网掩码.网关及DNS等 ...

最新文章

  1. ImportError: No module named pil
  2. 如何安装SAP JCo3
  3. 银行营业网点管理系统——implt包(CityAreaDaoImpl )
  4. angular2安装笔记
  5. 基础知识学习-数据结构篇
  6. 为啥arm架构比x86 x64省电?
  7. html5片转为base64,base64和图片的互转(HTML5的File实现)
  8. 在Java中获取系统属性
  9. loop设备及losetup命令介绍
  10. 简述静态全局变量的概念 C++
  11. 爬虫百度图片进入百度验证怎么办?
  12. 视频显示器与服务器之间使用什么线连接,显示器连接线有哪些?四种主流连线科普。...
  13. 【智能制造】服装企业数字化转型之路
  14. Smartbi制作报表教程:热销车型分类排名总表
  15. 微信小程序 之修改switch组件尺寸大小
  16. Android5.0系统下代码格式化sd卡方法
  17. mplayer - Linux下的电影播放器
  18. 人员招聘与培训实务【3】
  19. android gl修改工具,Android OpenGL学习笔记五 gl的一些方法
  20. 重新做计算机老师的说说,说说我们电脑班老师 ── 刁元清

热门文章

  1. Thymeleaf的学习
  2. 终端/Shell 快捷键
  3. java环境变量配置方法
  4. 操作系统概念学习笔记 10 CPU调度
  5. MySQL学习笔记——第1章 数据库和MySQL
  6. JavaScript验证表单大全【自用】
  7. WCF作为SAO技术的核心:契约
  8. ELK详解(十七)——filebeat输出到Redis和Elasticsearch实战
  9. 华三 h3c ppp配置
  10. nyoj--58--最少步数