并发编程工具集——Future(二十七)

news2024/11/15 4:23:57

简介:

  1. 创建完线程池,该如何使用
  2. 获取任务的执行结果(execute() 方法没有返回值)。

如何获取任务执行结果

  1. Java 通过 ThreadPoolExecutor 提供的 3 个 submit() 方法和 1 个 FutureTask 工具类来支持获得任务执行结果的需求。三个submit()以及区别如下区别:
  2. 提交 Runnable 任务 submit(Runnable task) :这个方法的参数是一个 Runnable 接口,Runnable 接口的 run() 方法是没有返回值的,所以 submit(Runnable task) 这个方法返回的 Future 仅可以用来断言任务已经结束了,类似于 Thread.join()。
  3. 提交 Callable 任务 submit(Callable<T> task):这个方法的参数是一个 Callable 接口,它只有一个 call() 方法,并且这个方法是有返回值的,所以这个方法返回的 Future 对象可以通过调用其 get() 方法来获取任务的执行结果。
  4. 提交 Runnable 任务及结果引用 submit(Runnable task, T result):
    • 这个方法很有意思,假设这个方法返回的 Future 对象是 f,f.get() 的返回值就是传给 submit() 方法的参数 result。
    • 关于它的经典用法。需要注意的是 Runnable 接口的实现类 Task 声明了一个有参构造函数 Task(Result r) ,创建 Task 对象的时候传入了 result 对象,这样就能在类 Task 的 run() 方法中对 result 进行各种操作了。result 相当于主线程和子线程之间的桥梁,通过它主子线程可以共享数据。
  5. 它们的返回值都是 Future 接口,Future 接口有 5 个方法,取消任务的方法 cancel()、判断任务是否已取消的方法 isCancelled()、判断任务是否已结束的方法 isDone()以及2 个获得任务执行结果的 get() 和 get(timeout, unit),其中最后一个 get(timeout, unit) 支持超时机制。
  6. 通过 Future 接口的这 5 个方法发现,我们提交的任务不但能够获取任务执行结果,还可以取消任务。不过需要注意的是:这两个 get() 方法都是阻塞式的,如果被调用的时候,任务还没有执行完,那么调用 get() 方法的线程会阻塞,直到任务执行完才会被唤醒。(此时阻塞的不是调用的线程,而是主线程)

  7. FutureTask 工具类:
    • 该类有两个构造函数,参数和前面的 submit() 方法类似

    • 如何使用:FutureTask 实现了 Runnable 和 Future 接口,由于实现了 Runnable 接口,所以可以将 FutureTask 对象作为任务提交给 ThreadPoolExecutor 去执行,也可以直接被 Thread 执行;又因为实现了 Future 接口,所以也能用来获得任务的执行结果。下面的示例代码是将 FutureTask 对象提交给 ThreadPoolExecutor 去执行。

    • FutureTask 对象直接被 Thread 执行的示例代码如下所示。利用 FutureTask 对象可以很容易获取子线程的执行结果。

补充

  1. 利用 Java 并发包提供的 Future 可以很容易获得异步任务的执行结果,无论异步任务是通过线程池 ThreadPoolExecutor 执行的,还是通过手工创建子线程来执行的。
  2. 利用多线程可以快速将一些串行的任务并行化,从而提高性能;如果任务之间有依赖关系,比如当前任务依赖前一个任务的执行结果,这种问题基本上都可以用 Future 来解决。

 

 

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

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

相关文章

2024年哪些充电宝建议买?最建议买的四款充电宝排行榜!

在 2024 年&#xff0c;充电宝依然是我们生活中不可或缺的电子伴侣。然而&#xff0c;面对市场上众多的充电宝品牌和型号&#xff0c;要挑选到一款既实用又安全可靠的产品并非易事。充电宝的安全性至关重要&#xff0c;毕竟它与我们随身携带的电子设备紧密相连。劣质的充电宝可…

C++软件开发值得推荐的十大高效软件分析工具

目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY++ 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工…

[240801] 类 C 语言 C3 是一种进化,而不是一场革命 | 趣文: find + mkdir 是图灵完备

目录 类 C 语言 C3 是一种进化&#xff0c;而不是一场革命C3 编程语言特征C3 设计原则安装 C3 编程语言第一个 C3 项目 趣文&#xff1a;find mkdir 是图灵完备 类 C 语言 C3 是一种进化&#xff0c;而不是一场革命 C3 是基于 C 的编程语言&#xff0c;它是 C 的一种演变&…

2024最新全开源付费进群系统源码二开修复版 支持易支付

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全开源付费进群系统源码&#xff0c;开源无加密无授权&#xff0c;优化电脑端访问布局&#xff0c;支持dai理&#xff0c;对接易支付通道&#xff0c;dai理可以配置自己易支付接口&am…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第四篇 嵌入式Linux系统移植篇-第七十二章 内核配置屏幕驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

ChatGPT:数据库不符合第二范式示例

ChatGPT&#xff1a;数据库不符合第二范式示例 这张图片为什么不符合数据库第二范式 这个表格不符合数据库第二范式&#xff08;2NF&#xff09;的原因如下&#xff1a; 1. 数据库第二范式&#xff08;2NF&#xff09;定义 第二范式要求一个数据库表格在满足第一范式&#xf…

【Hot100】LeetCode—169. 多数元素

目录 题目1- 思路2- 实现⭐169. 多数元素——题解思路 3- ACM 实现 题目 原题连接&#xff1a;169. 多数元素 1- 思路 定义两个变量 一个是 count&#xff1a;维护当前元素的出现次数一个是 ret &#xff1a;维护当前元素 思路 遍历整个数组**①如果 count 0 **&#xff…

了解对称加密与密钥协商技术

1.对称加密算法 加密的理论基础是替代和换位。替代主要用于扰乱&#xff0c;使用不同的位、字符或字符分组来替换原来的位、字符或字符分组。换位主要用于扩散&#xff0c;并不使用不同的文本来替换原来的文本&#xff0c;而是对原有的值进行置换&#xff0c;即重新排列原来的位…

Django开发企业官网

1.在本地创建一个website的文件夹&#xff0c;在vc里面打开文件夹 2.创建虚拟环境和安装django 终端执行命令 python -m venv venv&#xff08;创建一个虚拟文件名字叫venv&#xff09; venv\Scripts\activate(启动虚拟环境) pip install django&#xff08;安装django&#x…

CRC的手算过程——MODBUS

软件计算结果&#xff1a; 原理参考下面的文章&#xff1a; https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html https://blog.csdn.net/weixin_44256803/article/details/105805628 https://blog.csdn.net/d_leo/article/details/73572373 手算过程如下&#x…

Day27 | 贪心算法 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

语言 Java 452. 用最少数量的箭引爆气球 用最少数量的箭引爆气球 题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐…

MATLAB(3)训练模型

前言 在MATLAB中训练模型通常涉及到选择一个合适的机器学习算法或深度学习框架&#xff0c;并准备相应的数据集。这里我将给出一个使用MATLAB的机器学习工具箱来训练一个简单的分类模型的示例代码。我们将使用逻辑回归&#xff08;Logistic Regression&#xff09;来分类一个简…

OpenCV 图像处理 轮廓检测基本原理

文章目录 基本原理关键函数和参数注意事项 示例代码示例效果代码详解findContours 函数原型findContours函数变体 基本原理 轮廓发现是图像处理中的一个重要步骤&#xff0c;用于检测物体的边界和形状。 图像预处理&#xff1a; 轮廓发现通常在灰度图像上进行。因此&#xff0…

科研经历——8/1——第一次审稿教程

文章目录 引言正文审稿通知审核论文界面Add reviewRequest view 评审结果 总结 引言 头一次被ICONIP选做审稿人&#xff0c;我还是听懵的&#xff0c;毕竟我也是主要的提交者之一&#xff0c;居然让我审人家的的文章&#xff0c;还是挺懵的&#xff01;不过&#xff0c;还是很…

【吊打面试官系列-Dubbo面试题】Dubbo 和 Dubbox 之间的区别?

大家好&#xff0c;我是锋哥。今天分享关于 【Dubbo 和 Dubbox 之间的区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Dubbo 和 Dubbox 之间的区别&#xff1f; Dubbo 和 Dubbox 是两个在 Java 开发领域中使用的 RPC 框架。它们之间的关系比较复杂&#x…

HT for Web 轻松构建组态拓扑结构

在现代的数据可视化和网络管理中&#xff0c;拓扑图是一种非常重要的工具。它可以直观地展示节点(Node)和节点之间的关系(Edge)。无论是在 2D 还是 3D 环境中&#xff0c;拓扑图都可以帮助我们更好地理解和管理复杂的系统。 然而&#xff0c;由于这些拓扑图通常极为复杂&#…

JAVA(多线程)day 7.31

ok了家人们今天学习多线程&#xff0c; 一.多线程相关概念 1.1 并行与并发 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个 CPU 上同时执行。 并发&#xff1a;在同一时刻&#xff0c;有多个任务在单个 CPU 上交替执行。 1.2 多线程 cpu同时执行多个程序。 好处…

Mix、Lab是一种生活状态#Mixlab夏日T恤

shadow&#xff1a;这款怎么样&#xff1f; 混合实验家 千*然 15:53&#xff1a; " 夸夸&#xff0c;帅爆 logo很有细胞活力啊&#xff01; 再开个白款&#xff0c;夏天凉快&#xff01;大T&#xff0c;冲&#xff01; ” shadow: 往常都是孵化社区成员的项目&#xff0c…

非线性面板数据实证模型及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 一、引言 在当今的经济和社会研究中&#xff0c;非线性面板数据模型的应用日益广泛。这类模型能够更好地捕捉数据中的复杂关系&#xff0c;为研究者提供更深入和准确的分析结果。…

json-server(快速搭建本地 RESTful API 的工具)

json-server 是什么? Json-server 是一个零代码快速搭建本地 RESTful API 的工具。它使用 JSON 文件作为数据源,并提供了一组简单的路由和端点,可以模拟后端服务器的行为。 github地址:GitHub - typicode/json-server: Get a full fake REST API with zero coding in less…