要点总结

Executor表示的任务类型

主要有3种:
  1. Runnable: 无返回值,无异常抛出;
  2. Callable:有返回值,可以异常抛出;
  3. Future任务: 表示异步计算,可取消; 通过newTaskFor()方法,将Runnable/Callable任务转换为Future任务;









由上面可知: FutureTask既是Runnable任务,也是Future任务;





Future任务的创建方法

Future任务的特点:
  1. 异步计算:通过get()方法来获取异步计算的结果;
  2. 可取消;


创建Future任务
主要有2种方式:
  1. 通过FutureTask构造函数来创建;(事实上,FutureTask是Future接口的唯一实现)
  2. 通过ExecutorService的submit()方法来创建;

  • 方式1:通过FutureTask的构造函数来创建;

  • 方式2:通过ExecutorService的submit()方法来创建;

由上面可知:ExecutorService.submit()最终还是使用FutureTask构造函数来创建Future任务;

Executor框架,任务提交的2种方式

  1. Executor接口:executor(Runnable command);
  2. ExecutorService.submit(xxx): 是对Executor接口提交任务的扩充;

  • 方式1:

  • 方式2:





ExecutorService接口

ExecutorService接口是对Executor接口的扩展,主要增加了如下方法:
  1. 生命周期管理方法;
  2. 提交任务的简便方法;

shutdown()和shutdownNow()比较

  1. shutdown():平缓关闭,不会接收新任务的提交,会等待已提交任务全部执行完;
  2. shutdownNow():粗暴关闭,不会接收新任务的提交,尝试取消正在运行的任务,返回已提交但尚未运行的任务列表;



批量任务:invokeAll()/invokeAny()


方法说明





invokeAll()实现原理




CompletionService接口

具体实现类: ExecutorCompletionService
  • 用于提交批量异步任务,并获取结果;
  • 用于将批量异步任务的生产和消费进行解耦;

方法介绍

使用示例


实现原理

  • Executor: ExecutorCompletionService委托Executor来执行任务提交操作;
  • BlockingQueue: 委托BlockingQueue来保存计算结果;



步骤1:提交任务
  1. 将提交的任务封装为QueueingFuture;
  2. 委托Executor进行任务提交;

步骤2: 重写done()方法
  1. 重写FutureTask的done()方法,当Future任务执行完成后,调用done(),将Future任务添加到BlockingQueue中;


步骤3:
  1. 委托BlockingQueue实现获取任务的同步;

CompletionService接口和ExecutorService.invokeAll()比较

相同点:
都可以进行批量任务提交与处理;

不同点:
ExecutorService.invokeAll():
  1. 每次提交1组任务,返回时,也是返回1组任务(Future);
  2. 必须等待所有任务执行完,才会返回结果,返回的任务列表与提交的任务列表顺序相同

CompletionService接口:
  1. 每次提交1个任务,任务执行完成后,会将任务放到BlockingQueue中;
  2. BlockingQueue中存放的任务顺序,与提交的任务顺序很可能不同,哪个任务先执行完,就先放入哪个任务;
  3. 不必等待所有任务执行完;
































配置ThreadPoolExecutor


































附件列表

【并发编程】Executor架构介绍的更多相关文章

  1. Java 并发编程——Executor框架和线程池原理

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  2. (转)java并发编程--Executor框架

    本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...

  3. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  4. Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable

    一.Exectuor框架简介 Java从1.5版本开始,为简化多线程并发编程,引入全新的并发编程包:java.util.concurrent及其并发编程框架(Executor框架). Executor ...

  5. Java 并发编程 Executor 框架

    本文部分摘自<Java 并发编程的艺术> Excutor 框架 1. 两级调度模型 在 HotSpot VM 的线程模型中,Java 线程被一对一映射为本地操作系统线程.在上层,Java ...

  6. java并发编程-Executor框架

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...

  7. Java 并发编程 Executor

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...

  8. Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10739579.html,希望大家多多支持!!! 一.线程基础 1.线程与进程 线程是指进程 ...

  9. java并发编程 Executor,Executors,ExecutorService,CompletionService,Future,C

    使用CompletionService获取多线程返回值 CompletionService和ExecutorCompletionService详解 Java并发编程系列之十五:Executor框架

随机推荐

  1. Codeforces Round #394 (Div. 2) A,B,C,D,E

    A. Dasha and Stairs time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. bzoj 2818 gcd 线性欧拉函数

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 给定整数N,求1< ...

  3. Abstract Factory(抽象工厂)

    意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关 ...

  4. 探索解析微服务下的RabbitMQ

    概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...

  5. [翻译]PyMongo官方文档

    PyMongo官方文档翻译 周煦辰 2016-06-30 这是本人翻译的PyMongo官方文档.现在网上分(抄)享(袭)的PyMongo博客文章很多,一方面这些文章本就是抄袭的,谈不上什么格式美观,另 ...

  6. Miller_Rabin(米勒拉宾)素数测试

    2018-03-12 17:22:48 米勒-拉宾素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数.卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义 ...

  7. Powerdesigner颜色设置

    Powerdesigner颜色设置    

  8. 001——php字符串中的字符串定义

    <?php /** * 一.定义字符串: * ''单引号 ""双引号 <<<定界符 */ /* $url='http://baidu.com'; $baid ...

  9. halcon之最小二乘拟合直线

    如果不了解最小二乘算法 请先阅读: Least squares的算法细节原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中拟合直线会用ho ...

  10. Xilinx Microblaze Bootloader

    作者:Hello,Panda 一般而言,Xilinx Microblaze会被用来在系统中做一些控制类和简单接口的辅助性工作,比如运行IIC.SPI.UART之类的低速接口驱动,对FPGA逻辑功能模块 ...