【并发编程】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框架
随机推荐
- hexo + Github 搭建问题综述
1.Mac下安装hexo Error: Cannot find module './build/Release/DTraceProviderBindings 解决: solution 2.node s ...
- SQL优化:清理生产环境中已失效字段基本步骤
1.统计相应字段的数据情况(如:几年没更新,无数据等情况) 2.确认产品逻辑已无效(产品经理邮件确认) 3.数据备份 4.将数据清空(置为0或空) 5.测试环境中删除引用页面 6.修改定时程序,存储过 ...
- mybatis generator为实体类生成自定义注释(读取数据库字段的注释添加到实体类,不修改源码)
我们都知道mybatis generator自动生成的注释没什么实际作用,而且还增加了代码量.如果能将注释从数据库中捞取到,不仅能很大程度上增加代码的可读性,而且减少了后期手动加注释的工作量. 1.首 ...
- shell 判断是否是目录
创建一个文件和一个文件夹 touch sss mkdir d test.sh #!/bin/bash echo "enter the name:" read filename if ...
- Redis为什么要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘.所以Redis具有快速和数据持久化的特性. 如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能.在内 ...
- 更改CentOS7登录画面的分辨率
设置成用VNC Viewer去连接虚拟机的CentOS7 , 可是分辨率都得等登录了才能生效. 登录画面显示时,分辨率老大了. 找到了下面的文章 , 把 home/<user>/.conf ...
- linux系统时间获取方式
Linux 操作系统计算系统时间:主要函数:time localtime gmtime asctime ctime mktime difftime s ...
- HDU-5492 Find a path (枚举+DP)
Problem Description Frog fell into a maze. This maze is a rectangle containing N rows and M columns. ...
- UVA-11491 Erasing and Winning (单调队列)
题目大意:给一个数字(开头非0),拿掉其中的d个数字,使剩下的数字最大(前后顺序不能变). 题目分析:拿掉d个数字,还剩下n-d个数字.相当于从n个数字中按先后顺序选出n-d个数字使组成的数字最大,当 ...
- IOS-高仿bilibili项目
高仿bilibili项目成长之路 (logo) 高仿bilibili项目 Github链接:(https://github.com/MichaelHuyp/Bilibili_Wuxianda) 目前完 ...