要点总结

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. RabbitMQ 一个demo

    Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  2. CAP原则和BASE理论

    CAP原则 CAP原则又称CAP定理,是一个经典的分布式系统理论.CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错 ...

  3. Hbase Scan的重要参数

    Scan是操作Hbase中非常常用的一个操作,虽然前面的Hbase API操作简单的介绍了Scan的操作,但不够详细,由于Scan非常常用,关于其详细的整理也是很有必要的. Scan HBase中的数 ...

  4. javascript中back(-1)和go(-1)的区别

    javascript中back(-1)和go(-1)的区别 一.总结 一句话总结: 数据 history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1 ...

  5. bzoj 3730 震波 (动态点分治)

    大意: 给定n节点树, 每个节点有权值, 边权全为1. 给定m个操作: 操作1: (0,x,k) 表示询问到节点x距离不超过k的节点权值和 操作2: (1,x,y) 表示将节点x的权值修改为y 对于所 ...

  6. UVALive-2531 The K-League (最大流建模+枚举)

    题目大意:有n支足球队,已知每支球队的已胜场数和任意两支球队之间还需要的比赛场数a[i][j],求最终可能夺冠的所有球队. 题目分析:枚举所有的球队,对于球队 i 让它在接下来的比赛中全部获胜,如果这 ...

  7. 在使用DBMS_LOB.WRITEAPPEND()追加Clob内容的时候,报数字或值异常

    在实际的使用中有可能会使用DBMS_LOB.WRITEAPPEND()去将Clob内容作为buffer增加到我们需要的对象中,但是在实际的使用中Clob大小往往是超过32767长度的,然而DBMS_L ...

  8. 唯一索引 && 主键索引

    唯一索引唯一索引不允许两行具有相同的索引值. 如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存. 当新数据将使表中的键值重复时,数据库也拒绝接受此数据.例如,如果在 ...

  9. 最短路之SPFA算法

    部分来自:http://blog.csdn.net/juststeps/article/details/8772755 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了. ...

  10. jQuery实现鼠标划过展示大图的方法

    这篇文章主要介绍了jQuery实现鼠标划过展示大图的方法,实例分析了jQuery操作鼠标事件及图片处理的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了jQuery实现鼠标划过展示大图 ...