当前位置:网站首页>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.
本文内容到此结束了,
如有收获欢迎点赞收藏关注️,您的鼓励是我最大的动力。
如有错误疑问欢迎各位大佬指出。
主页: 共饮一杯无的博客汇总保持热爱,奔赴下一场山海。
边栏推荐
猜你喜欢
mysql + redis + flask + flask-sqlalchemy + flask-session 配置及项目打包移植部署
LeetCode #101. 对称二叉树
proto3-2语法
字符串 | 反转字符串 | 双指针法 | leecode刷题笔记
虚拟机安装出现的问题汇总
ARP协议原理
字节秋招二面把我干懵了,问我SYN报文什么情况下会被丢弃?
The latest interview summary in 20022 brought by Ali senior engineer is too fragrant
Programmer's Exclusive Romance - Use 3D Engine to Realize Fireworks in 5 Minutes
GRPC整体学习
随机推荐
学长告诉我,大厂MySQL都是通过SSH连接的
LeetCode #101. Symmetric Binary Tree
MongoDB-查询中$all的用法介绍
推荐一个免费50时长的AI算力平台
LeetCode热题(11.合并两个有序链表)
香港服务器如何进行加密?
C# 获取系统已安装的.NET版本
李开复花上千万投的缝纫机器人,团队出自大疆
BeanFacroty和FactoryBean到底是什么?AppliacationContext它又是什么?
拍频造成的轻微震荡
标准C语言学习总结14
Reading and writing after separation, performance were up 100%
2022 Niu Ke Duo School (6) M. Z-Game on grid
MySQL事务隔离级别
父类的main方法可以被继承么?有什么特殊?
发明时代,「幂集创新」事关你我
从零开始Blazor Server(9)--修改Layout
微信支付开发流程
Web console control edit box
HAproxy:负载均衡