当前位置:网站首页>AQS同步组件-FutureTask解析和用例
AQS同步组件-FutureTask解析和用例
2022-08-09 11:58:00 【51CTO】
FutureTask原理
FutureTask间接实现了runnable接口和future接口,说明了futureTask是runnable与callnable的集合体,即是有返回值的runnable方法。因此,FutureTask可以交给Executor执行,也可以由调用线程直接执行(FutureTask.run())。
源码分析
构造函数
常用方法
根据FutureTask的run方法执行的时机,FutureTask可以处于以下三种执行状态:
- 未启动:在FutureTask.run()还没执行之前,FutureTask处于未启动状态。当创建一个FutureTask对象,并且run()方法未执行之前,FutureTask处于未启动状态。
- 已启动:FutureTask对象的run方法启动并执行的过程中,FutureTask处于已启动状态。
- 已完成:FutureTask正常执行结束,或者FutureTask执行被取消(FutureTask对象cancel方法),或者FutureTask对象run方法执行抛出异常而导致中断而结束,FutureTask都处于已完成状态。
- 当FutureTask处于未启动或已启动状态时,执行FutureTask.get()方法将导致调用线程阻塞
- 当FutureTask处于已完成状态时,执行FutureTask.get()方法将导致调用线程立即返回结果或抛出异常
- 当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将导致此任务永远不会被执行
- 当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断执行此任务线程的方式来试图停止任务
- 当FutureTask处于已启动状态时,执行FutureTask.cancel(false)方法将不会对正在执行此任务的线程产生影响(让正在执行的任务运行完成)
- 当FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false。
使用案例
FutureTask、Runnable、Callable
输出结果如下:
- 可以把FutureTask交给Executor执行
- 也可以通过ExecutorService.submit(…)方法返回一个FutureTask,然后执行FutureTask.get()方法或FutureTask.cancel(…)方法
- 除此以外,还可以单独使用FutureTask
Future、Callable
当一个线程需要等待另一个线程把某个任务执行完后它才能继续执行,此时可以使用FutureTask.
本文内容到此结束了,
如有收获欢迎点赞收藏关注️,您的鼓励是我最大的动力。
如有错误疑问欢迎各位大佬指出。
主页: 共饮一杯无的博客汇总保持热爱,奔赴下一场山海。
边栏推荐
- 【Untitled】
- API调用,API传参,面向对接开发,你真的会写接口文档吗?
- 张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
- 读写分离后,性能居然提升100%了呀
- 专业人士使用的 11 种渗透测试工具
- 研发需求的验收标准应该怎么写? | 敏捷实践
- Senior told me that the giant MySQL is through SSH connection
- 京东架构师呕心整理:jvm与性能调优有哪些核心技术知识点
- 修改VOT2018.json文件,去掉图片路径中的color
- Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
猜你喜欢
电解电容漏电流及均压
Information system project managers must memorize the core test sites (63) The main process of project portfolio management & DIPP analysis
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
Win10调整磁盘存储空间详解
二重指针-char **、int **的作用
西湖大学教授怎么看AI制药革命?|量子位智库圆桌实录
【Adobe Premiere Pro 2020】pr2020安装和基本操作【PR安装、新建项目流程、导入及管理素材项目文件、添加标记、创建出入点剪辑视频、快速剪接及自动音乐卡点的方法
LeetCode #101. Symmetric Binary Tree
Nature:猪死亡1小时后,器官再次运转
API调用,API传参,面向对接开发,你真的会写接口文档吗?
随机推荐
父类的main方法可以被继承么?有什么特殊?
_main C:/ti/ccs1011/ccs/tools/compiler/ti-cgt-c2000_20.2.1.LTS/lib/rts2800_fpu32.lib<ar在线升级跳转疑问
【Robustness of VQA-1】——2019-EMNLP-Don’t Take the Easy Way Out
Information system project managers must memorize the core test sites (63) The main process of project portfolio management & DIPP analysis
LeetCode热题(11.合并两个有序链表)
goalng-sync/atomic原子操作
水能自发变成“消毒水”,83岁斯坦福教授:揭示冬天容易得流感的部分原因...
Ways to prevent data fraud
Shell正则表达式,三剑客之grep命令
The redis library cannot be imported
【概率论】一元概率分布的平均化
PM2之配置文件
研发需求的验收标准应该怎么写? | 敏捷实践
Programmer's Exclusive Romance - Use 3D Engine to Realize Fireworks in 5 Minutes
BeanFacroty和FactoryBean到底是什么?AppliacationContext它又是什么?
LeetCode 1413.逐步求和得到正数的最小值
GET请求和POST请求区别
电解电容漏电流及均压
We really need DApp?Really can't meet our fantasy App?
MongoDB-查询中$all的用法介绍