要点总结

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. (转载)Ubuntu 16.04+1080Ti机器学习基本环境配置

    转载自:https://blog.csdn.net/mahonesun/article/details/80808930 一.设置网络 机器有两张网卡,将当前正在使用的"有线连接1" ...

  2. UVa 11248 网络扩容(最大流(需要优化))

    https://vjudge.net/problem/UVA-11248 题意: 给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否可以恰好修改一条弧的容 ...

  3. c++ 字符串拷贝以及合并

    #include<iostream> #include<string> using namespace std; class stringfun { ]; public: vo ...

  4. Html中文字过多,单行超出和多行超出显示省略号

    本博客主要介绍 前端开发中文本过多,以省略号显示. 效果如图:                单行: <!--单行--> <p class="pl">这个属 ...

  5. nginx会话保持之sticky模块

    nginx会话保持之nginx-sticky-module模块 在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:1.ip hash,根据客户端的IP,将请求分配到不同的服务器上:2.cooki ...

  6. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

  7. HDU 4687 Boke and Tsukkomi 一般图匹配,带花树,思路,输出注意空行 难度:4

    http://acm.hdu.edu.cn/showproblem.php?pid=4687 此题求哪些边在任何一般图极大匹配中都无用,对于任意一条边i,设i的两个端点分别为si,ti, 则任意一个极 ...

  8. 安装wamp后,127.0.0.1可以访问,localhost不能访问

    今天安装wamp后,127.0.0.1可以访问,localhost不能访问,出现 “error You don't have permission to access”的错误, 网上查了下,很多方法都 ...

  9. Python3 元组Tuple(十二)

    元组:tuple.tuple和list非常类似,但是tuple一旦初始化就不能修改 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...

  10. java基础11天

    冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处,第二次比较厚,最大值放在了倒数第二的位置,一直到第二个元素确定了,整个数组的顺序也就确定了 public class Ar ...