Future、FutureTask类解析

news2025/2/22 16:29:31

Future类

Future类提供了方法来检查异步调用是否完成、等待异步调用完成并获取异步调用返回结果。get()方法可以对线程进行阻塞,直到异步调用完成并返回结果。cancel()方法可以取消异步方法的执行。

Future是一个接口,定义了异步线程的返回结果的获取方法,以及异步线程执行的取消方法。下面看源码:

boolean cancel(boolean mayInterruptIfRunning);

尝试取消此任务的执行。如果任务已完成、已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用cancel时此任务尚未启动,则此任务不应运行。如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该中断以尝试停止任务。
此方法返回后,对isDone的后续调用将始终返回true。如果此方法返回true,则对isCancelled的后续调用将始终返回true。

V get() throws InterruptedException, ExecutionException;

如果需要,等待计算完成,然后检索其结果

V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;

如果需要,最多等待给定时间以完成计算,然后检索其结果(如果可用)。

FutureTask类解析

FutureTask类实现了Future接口定义的方法。FutureTask可以用于包装Callable或Runnable类,因为FutureTask实现了Runnable,所以Future任务可以提交给Executor执行。除了用作独立类之外,该类还提供了受保护的功能,这些功能在创建自定义任务类时可能很有用。

FutureTask构造函数中可接收Runnable类或Callable类。然后可以调用FutureTask的run方法。如此调用的话,Runnable或Callable中任务就在同一个线程里调用了,属于同步调用了。如下示例:

public static void main(String[] args) throws InterruptedException, ExecutionException {
        FutureTask<Integer> futureTask=new FutureTask<Integer>(new Callable<Integer>() {
            @Override
            public Integer call() {
                System.out.println(Thread.currentThread().getName());
                try{
                    Thread.sleep(5000);
                    System.out.println(666);
                }catch (Exception e){

                }
                return RandomUtils.nextInt();
            }
        });
        futureTask.run();
        System.out.println(Thread.currentThread().getName());
        Integer integer = futureTask.get();
        System.out.println(123);

    }

返回值如下,且是同步运行:
在这里插入图片描述
FutureTask对象也可以交付给另外一个线程或线程池执行,如下:

//托管给线程池处理
Future<?> futureResult = Executors.newCachedThreadPool().submit(future);
//托管给单独线程处理
new Thread(future).start();

此时FutureTask中任务与主线程就是异步执行了。通过get()方法可以阻塞主线程,等待异步线程的返回结果,通过cancel()方法可以取消异步线程执行。一般应用场景为主线程执行任务过多时,采用异步方式同时执行,并在最后等待异步都执行完后,统一结束主线程。

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

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

相关文章

初学python非常实用的10个小技巧,先收藏再说~

嗨害大家好鸭&#xff01;我是小熊猫❤ 最近双十一是不是都在买买买呢&#xff1f; 但是学习这件事情可不能懈怠鸭&#xff01; 今天就来讲讲python实用小技巧~ 源码、资料电子书点击此处 1.唯一性 以下方法可以检查给定列表是否有重复的地方&#xff0c; 可用set&#xff…

力扣刷题day37|1049最后一块石头的重量 II、494目标和、474一和零

文章目录1049. 最后一块石头的重量 II思路动态规划五部曲494. 目标和回溯思路动态规划背包思路动态规划五部曲474. 一和零思路动态规划五部曲1049. 最后一块石头的重量 II 力扣题目链接 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量…

深度学习模型部署全流程-模型训练

文章目录前言模型训练全流程1.数据准备2.数据加载3.搭建神经网络4.设置损失函数&#xff0c;优化器5.训练网络模型6.模型测试7.完整代码9.训练结果小结前言 该系列文章会介绍神经网络模型从训练到部署的全流程&#xff0c;对于已经参加工作的人可以快速的了解如何使用深度学习…

Android Studio入门之文本内容、大小、颜色的讲解及实战(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言或私信博主 一、设置文本的内容 1:在XML文件中通过属性android:text设置文本 <TextViewandroid:layout_width"wrap_content"android:layout_height"wrap_content"android:text"Hello World!"…

nordic 52832中添加RTT打印

JlinkRTT RTT是基于Jlink调试器的实时传输技术,可以代替串口打印一些调试信息,不需要额外接线。 nordic 52832官方例程中,会将RTT打印函数做进一步封装,下面就讲一下怎么开启52832中的RTT打印。 第一步 增加RTT代码 RTT源代码可以在segger官方网站下载,也可以在nordic 5…

使用 stream buffer 传递数据

使用 stream buffer 传递数据 概述 如前所述&#xff0c;队列虽然提供了任务之间传递数据的功能&#xff0c;但没有对通知机制进行优化&#xff0c;即不方便实现多次采集不同长度的数据&#xff0c;然后触发一次通知接收的机制。 特性概述 Streambuffer 的中文含意是“流式…

Chapter5.5:频率响应法

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选&#xff0c;仅包含部分经典习题&#xff0c;需要完整版习题答案请自行查找&#xff0c;本系列属于知识点巩固部分&#xff0c;搭配如下几个系列进行学习&#xff0c;可用于期末考试和考研复习。 自动控制原理(…

Hive与Hbase的区别与联系

一、概念 1&#xff0c;Hive hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询…

网站中的经典,分享那些我用过的宝藏网站

前言 本篇将会具体分享我在最开始学习编程时了解到的网站&#xff0c;并分享自己使用这些网站的感受&#xff0c;当然&#xff0c;如果我有说的不正确的或者需要补充的&#xff0c;欢迎评论区补充纠正。还有各位来自优秀学校的伙伴们&#xff0c;或许其中一些资源在你们的学校…

安卓开发Android studio学习笔记15:关于如何使用Okhttp框架的网络请求(调用API接口)

Android studio一、安卓基于HTTP网络编程(一)、两种请求方式(二&#xff09;、安卓基于HTTP网络编程的两种方式1、使用HttpURLConnection访问网络资源**2、利用HttpClient访问网络资源**&#xff08;1&#xff09;HttpGet&#xff08;2&#xff09;HttpPost二、基础Okhttp的网络…

修改 echarts 默认样式记录

1、修改折线图上的数据标记点 showSymbol:false , 表示不展示数据点&#xff0c;只有鼠标 hover 时&#xff0c; tooltip 展示。 series: [{name: 进场, // 名称&#xff0c;图例和 tooltip 中展示showSymbol: false, // 不展示数据标记点type: line, // 类型color: #0091FF…

大学解惑10 - CSS中的content怎么换行,以及使用before伪类的优点

大学解惑09 - 单独用HTML javascript CSS 实现三版99乘法表&#xff0c;你就是班里最靓的仔https://blog.csdn.net/xingyu_qie/article/details/127631612 ☆ 上一篇文章用前端HTML CSS JS基础写了3版99乘法表&#xff0c;有同学说终于把99乘法表写透了&#xff0c;但是紧接着就…

Linux关于JDK、Tomcat以及MySQL安装

目录 一、JDK安装 1、 上传jdk、tomcat安装包 2、解压两个工具包 3、配置环境 4、在配置文件中加入java环境变量&#xff1a; 5、保存&#xff0c;让新设置的环境变量生效 二、Tomcat安装 1、将tomcat解压到/opt下 2、配置环境变量 3、启动tomcat 4、创建启动脚本 三…

入门学习XSS漏洞,这一篇就够了

入门学习XSS漏洞&#xff0c;这一篇就够了1.XSS简介2.XSS的类型反射型XSS存储型XSSDOM型XSS1.XSS简介 XSS攻击&#xff0c;通常指黑客通过“HTML注入”篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#xff0c;控制用户浏览器的一种攻击。在一开始…

【沐风老师】怎么在3DMAX中使用MAXScript脚本动画编程?

大家可能对3dmax都抱有很浓厚的兴趣,但如果你接触到max脚本(MAXScript),你会觉得它比max本身更让人着迷,因为它更能拓展我们的想象力,或者帮助我们更好的提高工作效率。不过,MAXScript是解释语言,不适合编写过于复杂的功能,因为这将大大影响执行的速度。 言归正传,就…

jmeter模拟多IP访问

1. 前言&#xff1a; 今天一同事在压测时提到怎么用jmeter里虚拟多个ip来发送请求&#xff0c;我想了一下以前用LR时用过虚拟ip地址&#xff0c;jmeter还没有使用过。想着原理应该是相通的&#xff0c;既然LR都能支持的话&#xff0c;那Jmeter应该也是支持&#xff0c;于是就有…

ARM pwn 入门 (1)

最近笔者刚刚加入了一个项目组&#xff0c;需要用到ARM架构的东西&#xff0c;和ARM pwn也有一定关系&#xff0c;因此一不做二不休&#xff0c;决定开始学习ARM pwn&#xff0c;顺便熟悉项目前置知识&#xff0c;一举两得。 ARM与x86分属不同架构&#xff0c;指令集不同&…

用frp搞个内网穿透

使用场景&#xff1a; 在公司用电脑敲代码&#xff0c;环境都是localhost&#xff0c;有时候你要接第三方接口比如支付、或者企业微信的事件回调等&#xff0c;都需要一个公网地址&#xff0c;因为这时候是开发阶段&#xff0c;你即想要公司电脑上运行的环境又想要回调能找到你…

2022年首家民营征信机构浙江同信获企业征信备案公示

2022年首家民营征信机构浙江同信获企业征信备案公示 2022年11月1日&#xff0c;中国人民银行杭州中心支行公示了浙江同信企业征信服务有限公司企业征信机构备案&#xff0c;该机构为浙江省进行备案公示的第九家机构。其他八家分别为芝麻信用管理有限公司、浙江有数数智科技有限…

Transform介绍(1)

文章目录1. transform 方法2. transform 增量模式3. 注册 Transform使用Transform的常见场景有埋点统计、耗时监控、方法替换 通过上图以我们了解下transform的作用&#xff0c;transform在 class 到 dex 之间工作&#xff0c;处理包括 javac 编译后的字节码文件&#xff0c;每…