ExecutorService框架
java中的ExecutorService主要是围绕Executor,ExecutorService,Runnable,Future,Delayed几个抽象类来展开的。Runnalbe+Future构成了基于返回值的,Runnable+Future+Delay构成了基于时间调度的
1、ExecutorService的类层次设计
2、Future类层次设计
默认实现是FutureTask。run方法是任务的执行体,线程是调用 该方法来具体运行任务的。如果任务没有取消,则该方法会运行任务,并且将结果设置到outcome变量中。
支持的状态有
NEW | 0 |
COMPLETING | 1 |
NORMAL | 2 |
EXCEPTIONAL | 3 |
CANCELLED | 4 |
INTERRUPTING | 5 |
INTERRUPTED | 6 |
执行时如果状态不为NEW或者任务的执行者不为空时直接退出,可以防止同一个FutureTask对象被提交给多个线程来执行,导致run方法被多个线程同时执行造成混乱。在调用call()后,使用set()设置结果时,会将NEW状态更新为COMPLETING,设置成功后,将状态更新为NORMAL,同时调用finishCompletion,激活waiters链表中所有由于等待获取结果而被阻塞的线程,并从waiters链表中移除之它们,等所有由于等待该任务结果的线程被唤醒后,调用don()方法,默认实现是空实现。
get获取结果时,如果当前状态小于等于COMPLETING时,说明任务还没有完成,调用awaitDone挂起调用线程。如果任务已经完成,就调用report上报结果,状态是NORMAL时,返回outcome,状态大于等于CANCELLED,抛出取消异常。
- 如果任务被中断,则从等待链表中移除当前线程对应的节点 ,然后抛出InterruptedException异常。
- 如果当前任务的状态大于COMPLETING,把执行任务的线程的引用设置为null,并且返回结果
- 如果任务状态为COMPLEING,说明任务已经完成,只有结果没有设置到outcome中,这时让当前线程放弃CPU执行,为了让任务执行线程获取到CPU从而将任务状态从COMPLETING转换到状态NORMAL,避免当前调用get系列方法的线程被挂起,然后再被唤醒的开销。
- 在等待时,如果当前q为null,则创建一个与当前线程相关的节点,如果当前线程对应节点还没有放入waiters管理的等待列表,则使用CAS操作放入。
- 如果设置了超时时间则使用LockSupport.parkNanos(this,nacos)让当前线程挂起deadline时间,否则会调用LockSupoot.park(this)让线程一直挂起直到其他线程调用 了unpack方法,
其状态机图为
3、ThreadPoolExecutor中的拒绝策略设计
4、BlockingQueue类层次设计
5、CompletionService类层次设计
6、线程池状态
ctl(AtomicInteger)表示线程池状态,高3位表示运行状态,其余位表示运行的线程数
RUNNING | 111 |
SHUTDOWN | 000 |
STOP | 001 |
TIDYING | 010 |
TERMINATED | 011 |
shutdown()将运行状态设置为SHUTDOWN,不接受新任务并且处理阻塞队列中的任务
shutdownNow()将运行状态设置为STOP,拒绝新任务并且丢弃队列中的任务,同时中断正在处理的任务
TIDYING状态是在所有任务执行完,阻塞队列里也没有任务,当前线程池活动线程数等于0,接着会调用terminated方法
TERMINATED结束状态,在执行完terminated方法后的状态。
7、ThreadPoolExecutor中参数意义
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)
corePoolSize:核心线程数,也可以理解为最小线程数
maximumPoolSIze:最大线程数
keepAliveTime:当线程大于核心线程数,空闲线程在结束时等待任务到达的超时时间,对于FixedThreadPool,SingleThreadPool,keepAliveTime为0,表示空闲时立即结束线程,对于CachedThreadPool,keepAliveTime为60s,表示空闲时,60s时间内没有任务时就结束线程
8、Worker
Worker创建时将状态设置为-1,为了防止在执行runWorker时被中断
ExecutorService框架相关推荐
- 戏(细)说Executor框架线程池任务执行全过程(上)
原文链接 归档下发表于infoq.com 2015年6月的两篇文章. 内容综述 基于Executor接口中将任务提交和任务执行解耦的设计,ExecutorService和其各种功能强大的实现类提供 ...
- ExecutorService等待线程完成后优雅结束
1.概述 该ExecutorService框架可以很容易地在处理多线程任务.我们将举例说明我们等待线程完成执行的一些场景. 此外,我们将展示如何正常关闭ExecutorService并等待已经运行的线 ...
- Future和FutureTask实现异步计算
开发Android APP经常会使用AsyncTask框架来异步加载资源或者异步到服务器拉消息,等任务完成后再主动更新结果到UI主线程,AsyncTask框架可以非常方便的获取线程异步执行结果.Jav ...
- Task一个轻量级分布式任务计算系统
Task系统设计与使用 Task是一个轻量级的分布式任务计算系统,他可以帮助你快速编写一个可以在集群环境下运行的分布式方法,而这只需要你使用一行代码就可以在你原有的方法上做到. 一个简单例子: pub ...
- fork join框架_Fork / Join框架vs.并行流vs.ExecutorService:最终的Fork / Join基准
fork join框架 Fork / Join框架在不同配置下如何工作? 就像即将到来的<星球大战>(Star Wars)一样,围绕Java 8并行性的批评也充满了兴奋. 并行流的语法糖带 ...
- Fork / Join框架vs并行流vs.ExecutorService:最终的Fork / Join基准
Fork / Join框架在不同配置下如何工作? 就像即将上映的<星球大战>一样,围绕Java 8并行性的批评也充满了兴奋. 并行流的语法糖带来了一些炒作,就像我们在预告片中看到的新型光剑 ...
- 转: java并发编程-Executor框架
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...
- Java基础篇:Executor框架
文章目录 概述 Executor框架结构 Executor框架的使用示意图 `ThreadPoolExecutor`类介绍 `ThreadPoolExecutor` 类分析 推荐使用 `ThreadP ...
- java fork_浅谈Java的Fork/Join并发框架
前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...
最新文章
- WijmoJS 使用Web Workers技术,让前端 PDF 导出效率更高效
- 1209F - Koala and Notebook
- 技术深扒丨没点想象力都看不透这个网站的反爬措施!
- 计算机视觉--GIST特征及其MATLAB代码实现
- C语言中返回错误信息的函数总结
- sklearn分类器算法:决策树与随机森林及案例分析
- vue-cli搭建和“Cannot find module npm-cli.js” 、“operation not permitted” 、 deprecated coffee-script等错误
- 7-6 实现图形接口及多态性 (30 分)
- 你需要知道的基础算法知识——STL和基础数据结构(七)
- Java基础知识汇总
- div加jquery实现iframe标签的功能
- 在线程序员 计算器 (中文)
- 数据库substr……in……
- python贝叶斯算法的论文_3个范例带你读懂贝叶斯法则
- Google推出拼音输入法了!
- MySQL高级2-优化分析
- 阿里云创始人王坚:别人可以背弃理想,我不可以
- Android 9,安卓开发项目实战
- mulesoft MCIA 破釜沉舟备考 2023.02.10.01
- 慎用!!! rm -rf 潜藏着巨大的危险!
热门文章
- 8.0 C++远征:对象数组
- jQuery常用事件处理
- 417,你的能量不容低估,也不能高估
- ADO.NET 快速入门(一):ADO.NET 概述
- svn中出现各种感叹号说明
- ASP 0104:80004005 问题解决方法
- 在 Rss Bandit 和 SharpDevelop 之间的权衡
- python3爬虫入门教程-有什么好的python3爬虫入门教程或书籍吗?
- python中文软件-Python3.8.3下载
- python散点图拟合曲线-python中的多元(多项式)最佳拟合曲线?