Java中的Future详解

news2024/12/28 21:29:17

1. Future的应用场景

在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。

Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。

举个例子:比如去吃早点时,点了包子和凉菜,包子需要等3分钟,凉菜只需1分钟,如果是串行的一个执行,在吃上早点的时候需要等待4分钟,但是因为你在等包子的时候,可以同时准备凉菜,所以在准备凉菜的过程中,可以同时准备包子,这样只需要等待3分钟。那Future这种模式就是后面这种执行模式。

2. Future的类图结构

Future接口定义了主要的5个接口方法,有RunnableFuture和SchedualFuture继承这个接口,以及CompleteFuture和ForkJoinTask继承这个接口。
在这里插入图片描述

RunnableFuture

这个接口同时继承Future接口和Runnable接口,在成功执行run()方法后,可以通过Future访问执行结果。这个接口都实现类是FutureTask,一个可取消的异步计算,这个类提供了Future的基本实现,后面我们的demo也是用这个类实现,它实现了启动和取消一个计算,查询这个计算是否已完成,恢复计算结果。计算的结果只能在计算已经完成的情况下恢复。如果计算没有完成,get方法会阻塞,一旦计算完成,这个计算将不能被重启和取消,除非调用runAndReset方法。

FutureTask能用来包装一个Callable或Runnable对象,因为它实现了Runnable接口,而且它能被传递到Executor进行执行。为了提供单例类,这个类在创建自定义的工作类时提供了protected构造函数。

SchedualFuture

这个接口表示一个延时的行为可以被取消。通常一个安排好的future是定时任务SchedualedExecutorService的结果

CompleteFuture

一个Future类是显示的完成,而且能被用作一个完成等级,通过它的完成触发支持的依赖函数和行为。当两个或多个线程要执行完成或取消操作时,只有一个能够成功。

ForkJoinTask

基于任务的抽象类,可以通过ForkJoinPool来执行。一个ForkJoinTask是类似于线程实体,但是相对于线程实体是轻量级的。大量的任务和子任务会被ForkJoinPool池中的真实线程挂起来,以某些使用限制为代价。

3. Future的主要方法

Future接口主要包括5个方法

在这里插入图片描述

get()方法可以当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕

get(long timeout,TimeUnit unit)做多等待timeout的时间就会返回结果

cancel(boolean mayInterruptIfRunning)方法可以用来停止一个任务,如果任务可以停止(通过mayInterruptIfRunning来进行判断),则可以返回true,如果任务已经完成或者已经停止,或者这个任务无法停止,则会返回false.

isDone()方法判断当前方法是否完成

isCancel()方法判断当前方法是否取消

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 生成csv中文出现乱码问题解决

最开始的核心代码如下: with open("/hardisk/exeport.csv", "w") as f: 核心代码 f.writelines("时间,事件描述,源ip,源端口,目的ip,目的端口,协议,告警等级,接口,告警次数,事件英文详述" "\r") for v in raw: f.write(str(v).re…

Python 二维码的读取与生成:使用链接生成二维码、读取二维码里的链接

Python 二维码的读取与生成演示① 使用链接生成二维码② 读取二维码里的链接[ 文章推荐 ] Python 绘制中国地图:使用 pyecharts 最新版本绘制中国地图实例详解,个性化地图定制及常用参数解析 ① 使用链接生成二维码 通过 pip install qrcode 安装 qrco…

C#语言实例源码系列-游戏-实现贪吃蛇

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

云原生技术在离线交付场景中的实践

作者介绍:郭逊,交付部总监,7年运维经验,云原生深度爱好者软件产品只有交付到用户手中才有价值,本人在面向政府等 ToG 场景的软件交付领域具有数年的工作经验,深知其中痛点。今天借助这篇文章,分…

启动报名:首届“星河杯”隐私计算大赛正式上线

当前,隐私计算技术发展迅速,行业应用稳步增长,逐渐成为实现数据安全流通的关键技术路径之一。然而,隐私计算发展过程中仍面临技术应用瓶颈、行业影响有限等挑战,亟需加快技术攻关、提升行业影响、深化产业应用。在此背…

PyFlink1.16.0 使用说明:建表及连接Mysql数据库

PyFlink1.16.0 使用说明:建表及连接Mysql数据库引言安装运行环境PyFlink创建作业环境一、创建一个 Table API 批处理表环境二、创建一个 Table API 流处理表环境三、创建一个 DataStream API 数据流处理环境PyFlink建表一、从Python List对象创建一个 Table二、创建…

理解Cookie 和 Session 的工作流程

又是一年初,首先祝大家新年快乐!!!Cookie什么是Cookie?由于HTTP是一种无状态的协议, 服务器单从网络连接上是无法知道用户身份的. 这时候服务器就需要给客户端发一个cooki, 用来确认用户的身份.简单的来说, cookie就是客户端保存用户信息的一种机制, 用来记录用户的一些信息.找…

基于JAVA的数据可视化分析平台,自由制作任何您想要的数据看板,支持接入SQL、CSV、Excel、HTTP接口、JSON等

数据可视化分析平台 自由制作任何您想要的数据看板 简介 DataGear是一款数据可视化分析平台,自由制作任何您想要的数据看板,支持接入SQL、CSV、Excel、HTTP接口、JSON等多种数据源。 完整代码下载地址:基于JAVA的数据可视化分析平台&…

Python模块与包(八)

python学习之旅(八) 👍查看更多可以关注查看首页或点击下方专栏目录 一.模块 (1) 什么是模块 一个Python文件,以.py 结尾,能定义函数,类和变量,也能包含可执行的代码 作用:我们可以认为不同的模块就是不同工具包,每一个工具包中都有各种不同的工具(如函…

Vue初识系列【2】

一 Vue入门 1.1 Vue简介 Vue 是一套用于构建用户界面的渐进式框架,发布于 2014 年 2 月。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库(如&a…

ZYNQ printk 缓冲区读取

之前调试kenel ,如果kenenl崩溃会,通过内核system.map定位log_buf变量地址,给cpu复位,在u-boot中读取对应的物理地址,即可知道最终内核崩溃最后打出的消息。 我在使用 5.4.154这个内核版本,中没有log_buf这…

金蝶附件上传接口开发思路

1️⃣需求描述:需要通过调用金蝶API接口实现指定单据的附件上传。本文以收料通知单为例,以Java代码示例进行讲解。 tips:阅读本文开始前,希望你是一名开发者同时阅读过: https://vip.kingdee.com/article/872325739310…

【小知识点】为爬虫训练场项目添加 Bootstrap5 时间轴

爬虫训练场建站时间轴:https://pachong.vip/timeline 背景 为了便于记录爬虫训练场项目更新日志,所以集成该功能,实现效果如下所示。 特别备注一下,时间轴是什么? 时间轴是一种常用的网站布局元素,通常用…

Forexclub:特斯拉四季度交付车辆创纪录,你认为2023年特斯拉销量如何

周一特斯拉宣布其2022年第四季度交付了创纪录的405278辆汽车。这一数字创下了该公司的纪录,但低于华尔街的估计。据报道,报告中对交付量的普遍估计为420760。特斯拉称:“2022年,汽车交付量同比增长40%,达到131万辆。”…

基于Vue和SpringBoot的论文检测系统的设计与实现

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

【信息论与编码 沈连丰】第七章:信息率失真理论及其应用

【信息论与编码 沈连丰】第七章:信息率失真理论及其应用第七章 信息率失真理论及其应用7.1 失真函数和平均失真度7.2 信息率失真函数7.3 信息率失真函数R(D)的计算7.4 保真度准则下的信源编码定理7.5 信息率失真函数与信息价值第七章 信息率失真理论及其应用 香农第…

网工、运维必备的免费在线画图工具,真的很好用!

都说一图胜千言,一个IT工程师如果能画的一手好图,无论是在方案选项、还是技术交流,都能快速表达自己的想法,让你的思路更加的直观明了;市面上的制图工具有很多,下面就推荐几款好用且免费的工具,…

SaaS服务最大的优势是哪些?(附免费试用)

SaaS服务十大优势 近些年来,SaaS(Software-as-a-Service)成为整个IT领域中最受欢迎的业务模型之一。由于SaaS的市场每年以近60%的速度增长,因此它正在取代更传统的应用市场,并将在未来几年内成为主导模式。…

【非侵入式负载监测】低采样率电动汽车充电的无训练非侵入式负载监测(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

一、TTY子系统介绍

个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、TTY介绍2、控制台终端2.1 系统控制台2.2 当前控制台2.3 虚拟控制台3、伪终端4、串口终端5. 其它类型…