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框架相关推荐

  1. 戏(细)说Executor框架线程池任务执行全过程(上)

    原文链接   归档下发表于infoq.com 2015年6月的两篇文章. 内容综述 基于Executor接口中将任务提交和任务执行解耦的设计,ExecutorService和其各种功能强大的实现类提供 ...

  2. ExecutorService等待线程完成后优雅结束

    1.概述 该ExecutorService框架可以很容易地在处理多线程任务.我们将举例说明我们等待线程完成执行的一些场景. 此外,我们将展示如何正常关闭ExecutorService并等待已经运行的线 ...

  3. Future和FutureTask实现异步计算

    开发Android APP经常会使用AsyncTask框架来异步加载资源或者异步到服务器拉消息,等任务完成后再主动更新结果到UI主线程,AsyncTask框架可以非常方便的获取线程异步执行结果.Jav ...

  4. Task一个轻量级分布式任务计算系统

    Task系统设计与使用 Task是一个轻量级的分布式任务计算系统,他可以帮助你快速编写一个可以在集群环境下运行的分布式方法,而这只需要你使用一行代码就可以在你原有的方法上做到. 一个简单例子: pub ...

  5. fork join框架_Fork / Join框架vs.并行流vs.ExecutorService:最终的Fork / Join基准

    fork join框架 Fork / Join框架在不同配置下如何工作? 就像即将到来的<星球大战>(Star Wars)一样,围绕Java 8并行性的批评也充满了兴奋. 并行流的语法糖带 ...

  6. Fork / Join框架vs并行流vs.ExecutorService:最终的Fork / Join基准

    Fork / Join框架在不同配置下如何工作? 就像即将上映的<星球大战>一样,围绕Java 8并行性的批评也充满了兴奋. 并行流的语法糖带来了一些炒作,就像我们在预告片中看到的新型光剑 ...

  7. 转: java并发编程-Executor框架

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...

  8. Java基础篇:Executor框架

    文章目录 概述 Executor框架结构 Executor框架的使用示意图 `ThreadPoolExecutor`类介绍 `ThreadPoolExecutor` 类分析 推荐使用 `ThreadP ...

  9. java fork_浅谈Java的Fork/Join并发框架

    前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...

最新文章

  1. WijmoJS 使用Web Workers技术,让前端 PDF 导出效率更高效
  2. 1209F - Koala and Notebook
  3. 技术深扒丨没点想象力都看不透这个网站的反爬措施!
  4. 计算机视觉--GIST特征及其MATLAB代码实现
  5. C语言中返回错误信息的函数总结
  6. sklearn分类器算法:决策树与随机森林及案例分析
  7. vue-cli搭建和“Cannot find module npm-cli.js” 、“operation not permitted” 、 deprecated coffee-script等错误
  8. 7-6 实现图形接口及多态性 (30 分)
  9. 你需要知道的基础算法知识——STL和基础数据结构(七)
  10. Java基础知识汇总
  11. div加jquery实现iframe标签的功能
  12. 在线程序员 计算器 (中文)
  13. 数据库substr……in……
  14. python贝叶斯算法的论文_3个范例带你读懂贝叶斯法则
  15. Google推出拼音输入法了!
  16. MySQL高级2-优化分析
  17. 阿里云创始人王坚:别人可以背弃理想,我不可以
  18. Android 9,安卓开发项目实战
  19. mulesoft MCIA 破釜沉舟备考 2023.02.10.01
  20. 慎用!!! rm -rf 潜藏着巨大的危险!

热门文章

  1. 8.0 C++远征:对象数组
  2. jQuery常用事件处理
  3. 417,你的能量不容低估,也不能高估
  4. ADO.NET 快速入门(一):ADO.NET 概述
  5. svn中出现各种感叹号说明
  6. ASP 0104:80004005 问题解决方法
  7. 在 Rss Bandit 和 SharpDevelop 之间的权衡
  8. python3爬虫入门教程-有什么好的python3爬虫入门教程或书籍吗?
  9. python中文软件-Python3.8.3下载
  10. python散点图拟合曲线-python中的多元(多项式)最佳拟合曲线?