【并发编程】Executor架构介绍


要点总结
Executor表示的任务类型
- Runnable: 无返回值,无异常抛出;
- Callable:有返回值,可以异常抛出;
- Future任务: 表示异步计算,可取消; 通过newTaskFor()方法,将Runnable/Callable任务转换为Future任务;






Future任务的创建方法
- 异步计算:通过get()方法来获取异步计算的结果;
- 可取消;

- 通过FutureTask构造函数来创建;(事实上,FutureTask是Future接口的唯一实现)
- 通过ExecutorService的submit()方法来创建;
- 方式1:通过FutureTask的构造函数来创建;

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

Executor框架,任务提交的2种方式
- Executor接口:executor(Runnable command);
- ExecutorService.submit(xxx): 是对Executor接口提交任务的扩充;
- 方式1:
- 方式2:



ExecutorService接口

- 生命周期管理方法;
- 提交任务的简便方法;
shutdown()和shutdownNow()比较
- shutdown():平缓关闭,不会接收新任务的提交,会等待已提交任务全部执行完;
- shutdownNow():粗暴关闭,不会接收新任务的提交,尝试取消正在运行的任务,返回已提交但尚未运行的任务列表;
批量任务:invokeAll()/invokeAny()
方法说明
invokeAll()实现原理

CompletionService接口
- 用于提交批量异步任务,并获取结果;
- 用于将批量异步任务的生产和消费进行解耦;

使用示例

实现原理
- Executor: ExecutorCompletionService委托Executor来执行任务提交操作;
- BlockingQueue: 委托BlockingQueue来保存计算结果;
- 将提交的任务封装为QueueingFuture;
- 委托Executor进行任务提交;
- 重写FutureTask的done()方法,当Future任务执行完成后,调用done(),将Future任务添加到BlockingQueue中;
- 委托BlockingQueue实现获取任务的同步;

CompletionService接口和ExecutorService.invokeAll()比较
- 每次提交1组任务,返回时,也是返回1组任务(Future);
- 必须等待所有任务执行完,才会返回结果,返回的任务列表与提交的任务列表顺序相同;
- 每次提交1个任务,任务执行完成后,会将任务放到BlockingQueue中;
- BlockingQueue中存放的任务顺序,与提交的任务顺序很可能不同,哪个任务先执行完,就先放入哪个任务;
- 不必等待所有任务执行完;

配置ThreadPoolExecutor
附件列表
【并发编程】Executor架构介绍的更多相关文章
- Java 并发编程——Executor框架和线程池原理
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- (转)java并发编程--Executor框架
本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...
- Java 并发编程——Executor框架和线程池原理
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
一.Exectuor框架简介 Java从1.5版本开始,为简化多线程并发编程,引入全新的并发编程包:java.util.concurrent及其并发编程框架(Executor框架). Executor ...
- Java 并发编程 Executor 框架
本文部分摘自<Java 并发编程的艺术> Excutor 框架 1. 两级调度模型 在 HotSpot VM 的线程模型中,Java 线程被一对一映射为本地操作系统线程.在上层,Java ...
- java并发编程-Executor框架
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...
- Java 并发编程 Executor
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...
- Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10739579.html,希望大家多多支持!!! 一.线程基础 1.线程与进程 线程是指进程 ...
- java并发编程 Executor,Executors,ExecutorService,CompletionService,Future,C
使用CompletionService获取多线程返回值 CompletionService和ExecutorCompletionService详解 Java并发编程系列之十五:Executor框架
随机推荐
- sqlmap简单使用方法
sqlmap使用 注入点 http://1xx.xxx.xxx.xxxx/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit# 通 ...
- 利用IntelliJ IDEA创建第一个Groovy工程
因为某些原因,需要学习一下Groovy.关于Groovy的入门教程请看这篇文章http://www.ibm.com/developerworks/cn/education/java/j-groovy/ ...
- 深入Linux内核架构第一章笔记
1. Linux是多任务系统, 支持并发执行若干进程,系统同时真正运行的进程数目不超过CPU的数量,因此内核会按照时间间隔在不同进程之间切换. 2.确定那个进程运行多长时间的过程称为调度. 3.内核启 ...
- 使用 Redis
Redis(https://redis.io/),既不像 SQLite 以表的形式存储数据,也不像 MongoDB 允许以嵌套结构存储和查询,它是一种内存数据库结构,即将数据缓存在内存中.它将键—值( ...
- HTML之页面镶嵌体验
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- hdu 6386 Age of Moyu (重边判断)
本来用一个map判重边结果T了, 实际上可以直接给边上打标记即可 int n, m; struct _ {int to,w,vis;}; vector<_> g[N]; int dis[N ...
- windowplayer播放列表属性
ArrayList a = new ArrayList(); a.Add("c:\\kugou\\林宇中 - 干物女.mp3"); a.Add("c:\\kugou\\海 ...
- C#接口作用
1.C#接口的作用 : C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正 ...
- run jdeveloper, unable to create an instance of the Java Virtual Machine Located at path:
刚才打开 jdevW.exe 时提示如下错误: Unable to create an instance of the Java Virtual MachineLocated at path:x:\x ...
- 222. Count Complete Tree Nodes -- 求完全二叉树节点个数
Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...