解开Future的神秘面纱之任务执行
此文承接之前的博文 解开Future的神秘面纱之取消任务 补充一些任务执行的一些细节,并从全局介绍程序的运行情况。
任务提交到执行的流程
前文我们已经了解到一些Future的实现细节,这里我们来梳理一下运行流程。这里只说sumbit(提交)
(1)客户端创建一个Callable或Runnable对象。
(2)客户端调用ExecutorService的submit方法,将任务提交给执行器。
(3)ExecutorService将调用其实现类AbstractExecutorService的submit方法。
(4)submit方法将获取到的Runnable/Callable任务交由其内部方法newTaskFor进行包装。
(5)newTaskFor方法将Runnable/Callable包装成FutureTask对象。
(6)submit把包装好的FutureTask对象交由execute方法执行,此方法有ThreadPoolExecutor提供。
(7)submit方法返回FutreTask对象给客户端。
任务提交为何能接收两种类型的接口?
实际上很有意思的是,FutureTask只使用Callable对象(因为使用Future的初衷就是想要获取任务处理结果),而Executor的execute只接收Runnable对象(执行器只管执行任务)
FutureTask接收到Runnable对象后,会利用适配器,将其适配为Callable对象进行使用。注意,Runnable适配后,返回值基本没什么意义,都是写死的。
而FutureTask实际上相当于Runnable对象的装饰器,FutureTask的继承结构如图所示:
我们知道Runnable定义了任务该做什么,Future定义了任务的控制操作,而RunnableFuture接口兼具这两个功能。
Future就是实现这组操作的实现类,它也是Runnable的装饰器类,Runnable任务在经过其包装后,仍然还是Runnable,不影响其交给execute方法执行。而且他实现了Future接口,也就可以根据它对任务进行控制。
FutureTask有哪些字段,用来做什么的?
(1)state => 状态,用于基于状态的控制操作。
NEW => 新建任务
COMPLETING www.tygj178.com=> 正在完成,即任务已经被线程启动
NORMAL => 正常完成任务
EXCEPTIONAL => 任务因为异常而终止
CANCELLED => 任务已被取消,注意这里并不表示任务实际状态,即任务可能还在运行。
INTERRUPTING => 中断任务中
INTERRUPTD => 任务已被中断
(2)callable www.ysyl157.com=> callable任务,实际被执行的任务
(3)outcome => 执行结果
(4)runner => 执行线程的引用,用来控制任务的执行。
(5)waiters => 等待线程队列,当任务还未完成时,用于保存因为获取结果的而被阻塞的线程。
FutureTask的状态变化
(1)NEW -> COMPLETING -> NORMAL(任务正常执行到结束)
(2)NEW -> COMPLETING -> EXCEPTIONAL(任务执行过程中出现异常)
(3)NEW -> CANCELLED (任务被取消)
(4)NEW -> INTERRUPTING -> INTERRUPTED (任务已经开始,尚未完成就被取消)
FutureTask如何确定其执行线程的?
任务的控制最主要的两个功能就是取消和获取结果。取消的操作,上一篇博文已经讲到了,获取结果将于下篇讲述。这里补充前篇的一些内容,也就是取消操作相关的细节,当时已经获知,要取消任务,实际上是通过中断任务的执行线程实现的,如图:
FutureTask的cancel方法
// The Vue build version to load with the `import` command
// (runtime-only or standalone)www.xinghenyule.com has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import boostrap from 'bootstrap/dist/css/bootstrap.css'
import store from 'www.ylouyi3.com./store/index.js'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,//在全局对象上加载仓库
components: { App },
template: 'www.dasheng178.com<App/>'
})
两个组件
+ View Code
navbar.vue
+ View Code
product.vue 该组件用于显示商品的详细信息
+ View Code
程序入口APP.vue
<template>
<div id="app">
<nav-bar>www.yinmaoyule178.com</nav-bar>
<router-view>www.chaoyueyule.net</router-view>
</div>
</template>
<script>
import NavBar from 'www.dfgjpt.com/./views/components/navbar'
export default {
name: 'App',
components:{NavBar}
}
</script>
但是,这个runner是何时被赋值的,我当时并不清楚,查阅源码也没发现什么setRunner之类的代码。后来突然想到,只有在任务被执行的时候才能知道,它到底被哪个线程执行。于是才注意到了这段CAS的代码,(当时不太懂,所以就算看到了这段代码,也不明白)。意思就是说,如果当前对象的runner字段值为null,就将其设置为当前的执行线程。到这里,我们就有了此线程的引用。
FutureTask到达ThreadPoolExecutor的execute之后,是什么情形?
这里简要说一下,任务到达ThreadPoolExecutor之后,线程池会根据当前线程数量的情况进行处理,可能创建一个新线程来执行,或者加入到任务队列等待执行,再或者就是被线程池抛弃等等。
相关细节可查看,我关于ThreadPoolExecutor的相关博文。
转载于:https://www.cnblogs.com/qwangxiao/p/9902363.html
解开Future的神秘面纱之任务执行相关推荐
- 认识5G——解开5G的神秘面纱
认识5G 1.移动通信发展历程 2.5G的技术指标和三大应用场景 2.1.5G的技术指标 2.2.三大应用场景 3.5G应用场景 3.1.AR.VR.MR 3.2.车联网.自动驾驶.远控驾驶.编队驾驶 ...
- 解开lambda最强作用的神秘面纱
我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将 ...
- 揭开均线系统的神秘面纱_在应用程式审查API中揭开新玩法的神秘面纱
揭开均线系统的神秘面纱 During the #11WeeksOfAndroid the new Play In-App Review API was announced. This was a lo ...
- 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...
- C ++匿名函数:揭开C++ Lambda表达式的神秘面纱
潜意识编程:揭秘C++ Lambda表达式的神秘面纱 Subconscious Programming: Unveiling the Mystery of C++ Lambda Expressions ...
- 了解黑客的关键工具---揭开Shellcode的神秘面纱
2019独角兽企业重金招聘Python工程师标准>>> ref: http://zhaisj.blog.51cto.com/219066/61428/ 了解黑客的关键工具---揭开 ...
- 揭开J2EE集群的神秘面纱(一):什么是J2EE集群
揭开J2EE集群的神秘面纱(一):什么是J2EE集群 作者:不详 来源:CSDN博客 酷勤网收集 2008-04-18 摘要 酷勤网 J2EE集群技术包括负载均衡和失效转移.负载均衡意味着有许多客户端 ...
- exchange揭开拨号音还原法的神秘面纱
之前exchange揭开拨号音还原法的神秘面纱英文版本的翻译,用了两周的时间翻译出来!图片感觉很小,可以下载附件直接查看,会更好! 揭开exchange拨号音恢复的方法(第一部分) 在这三部分系列里, ...
- 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @OData.publish工作原理解析
Jerry的前一篇文章 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @ObjectModel.readOnly工作原理解析,给大家分享了@ObjectModel.readOnly这个注解对 ...
最新文章
- centos 调整系统时间
- Jenkins在Mac平台安裝
- 漫画科普:天线的原理?
- hadoop中map和reduce的数量设置问题
- docker 部署_Nginx K8s + Docker 部署 ,虚拟机部署教程。
- 记录一次在centos下使用gmp的悲伤
- 接触线叉环插座行业调研报告 - 市场现状分析与发展前景预测
- Debian安装chrome
- 论财务自由与【生活-工作】平衡
- win11 鼠标样式修改(大小和颜色)
- 高德地图导航简单实例
- 安卓c语言hook,C语言hook技术实现木马功能-盗QQ密码
- Fabric-ca与现有fabric网络组织绑定
- 神器啊,理工男的春天来了!
- [教程]在VS上使用scanf,解决scanf报错问题
- json mysql 字段 默认值_MySQL新增JSON类型字段的使用总结
- APP个人开发者月入仅千元,应用开发创业为何这么难?
- Python命名空间和作用域窥探
- 关于 金山词霸2012 v3.4版本的一些意见和建议
- MacOS国产单片机正版Jlink调试配置和eclipse开发配置
热门文章
- 怎样让公式编号不从1开始
- 中国联通加快数据中心建设:全网机架数量超过32万架
- 关于“服务器提交了协议冲突. Section=ResponseStatusLine问题
- 演示数据块整理(合并)的效果
- 如何从Alfresco中提取Language Pack
- IIS服务在启动默认网站(停止)时显示发生意外错误0x8ffe2740,
- python中re模块的函数_python中的re模块,常用函数介绍
- oracle exp调过坏块,无备份坏块处理(跳过方式)
- Java虚拟机(八)——堆
- 2-4实战分类之模型构建