学习分享-FutureTask

前言

今天再改简历的时候回顾了之前实习用到的FutureTask,借此来回顾一下相关知识。

FutureTask 介绍

FutureTask 是 Java 并发包(java.util.concurrent)中的一个类,用于封装异步任务。它实现了 RunnableFuture 接口,而 RunnableFuture 接口继承了 RunnableFuture 接口。因此,FutureTask 既可以作为 Runnable 执行任务,也可以作为 Future 获取任务的结果。

主要功能
  • 任务执行:可以通过线程池或单独的线程执行 FutureTask
  • 结果获取:可以通过 Future 接口的 get 方法获取任务执行的结果。
  • 任务取消:可以通过 Future 接口的 cancel 方法取消任务的执行。
  • 任务状态查询:可以查询任务是否已经完成、是否被取消等状态。
主要方法
  • run():执行任务,当任务完成后设置其状态和结果。
  • get():等待任务执行完成,并返回结果。
  • cancel(boolean mayInterruptIfRunning):取消任务的执行。
  • isDone():检查任务是否已完成。
  • isCancelled():检查任务是否已被取消。
示例代码

以下是一个简单的 FutureTask 使用示例:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;public class FutureTaskExample {public static void main(String[] args) {// 创建一个 Callable 任务,它返回一个字符串结果Callable<String> callableTask = () -> {Thread.sleep(2000);return "Task completed";};// 使用 FutureTask 封装 Callable 任务FutureTask<String> futureTask = new FutureTask<>(callableTask);// 创建一个单线程的线程池ExecutorService executorService = Executors.newSingleThreadExecutor();// 提交 FutureTask 给线程池执行executorService.submit(futureTask);// 主线程执行其他操作System.out.println("Main thread is doing other work...");try {// 获取 FutureTask 执行结果String result = futureTask.get();System.out.println("FutureTask result: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}// 关闭线程池executorService.shutdown();}
}
解释
  1. 创建任务:定义一个 Callable 任务,该任务会休眠 2 秒钟,然后返回字符串 “Task completed”。
  2. 封装任务:使用 FutureTaskCallable 任务封装起来。FutureTask 实际上就是一个可以异步执行的任务对象。
  3. 提交任务:将 FutureTask 提交给线程池执行。线程池会管理任务的执行,并将执行结果存储在 FutureTask 中。
  4. 主线程工作:在任务执行期间,主线程可以继续执行其他操作,不会被阻塞。
  5. 获取结果:调用 FutureTaskget 方法来获取任务的执行结果。如果任务还未完成,get 方法会阻塞,直到任务完成并返回结果。
  6. 关闭线程池:任务完成后,关闭线程池,释放资源。

FutureTask 提供了一种将 CallableRunnable 任务封装起来的机制,使得这些任务可以被异步执行,并且可以方便地获取任务的执行结果或取消任务。这使得编写并发程序更加简洁和高效。

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

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

相关文章

Win快速删除node_modules

在Windows系统上删除 node_modules 文件夹通常是一个缓慢且耗时的过程。这主要是由于几个关键因素导致的&#xff1a; 主要原因 文件数量多且嵌套深&#xff1a; node_modules 文件夹通常包含成千上万的子文件夹和文件。由于其结构复杂&#xff0c;文件和文件夹往往嵌套得非常…

JavaScript的数组排序

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

函数式开发接口( Consumer、Function)在实际开发中的应用场景

之前有个扫码下载文件需求&#xff0c;由于要同时进行记录下载人的记录。一开始用的是异步进行日志记录。发现有的用户扫码下载了一次文件&#xff0c;日志记录了三条。这种很容易联想到是因为网络抖动造成的。 问题代码 由于日志记录是异步的&#xff0c;文件下载需要时间。同…

干货下载 |《数据治理:数据中台建设与能力提升策略》

在当今这个信息爆炸的时代&#xff0c;数据已经成为企业最宝贵的资产之一。数据不仅能帮助企业洞察市场趋势&#xff0c;还能优化业务流程&#xff0c;提升运营效率&#xff0c;进而在激烈的市场竞争中占据优势地位。然而&#xff0c;如何有效地管理和利用这些数据&#xff0c;…

(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c0 的两个根:

(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2bxc0 的两个根: b2-4ac 称作一元二次方程的判别式。如果它是正值,那么一元二次方程就有两个实数根。 如果它为 0&#xff0c;方程式就只有一个根。如果它是负值&#xff0c;方程式无实根。 编写程序&#xff0c;提示…

推挽与开漏输出

一般来说&#xff0c;微控制器的引脚都会有一个驱动电路&#xff0c;可以配置不同类型的数字和模拟电路接口。输出模式一般会有推挽与开漏输出。 推挽输出 推挽输出&#xff08;Push-Pull Output&#xff09;&#xff0c;故名思意能输出两种电平&#xff0c;一种是推&#xf…

DOM-获取元素

获取元素的方法&#xff1a; 方法一&#xff1a;根据id获取元素document.getElementById <div id"time">2024-6-4</div> 在script标签中&#xff1a;注意getElementById括号里面必须要有引号&#xff0c;获得的是对象类型 var timer document.getEle…

设计模式——建造者模式(生成器模式)

建造者模式(生成器模式) 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示的意图 用了建造者模式&#xff0c;那么用户就只需要指定需要构建的类型就可以得到它们&#xff0c;而具体构造的细节和过程不需要知道 概括地说&#xff0c;Bu…

2. 音视频H264

视频软件基本流程 1.什么是H264 H.264是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&#xff08;JVT&#xff0c;Joint Video Team&#xff09;提出的高度压缩数字视频编解码器标准 H265又名高…

1004.最大连续1的个数

给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1,0,0,0,1,1,1,1,0], K 2 输出&#xff1a;6 解释&#xff1a;[1,1,1,0,0,1,1,1,1,1,1] 粗体数字…

算法题day43(补5.29日卡:动态规划03)

一、01背包问题基础&#xff1a; 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次&#xff0c;求解哪些物品装入背包里物品价值总和最大。 1.用dp的方法做&#xff1a; ①dp[i][j]的含义&#xff1a;从下标为[…

席卷的B站《植物大战僵尸杂交版》V2.0.88整合包,PC和手机可用,含通关存档和视频教程!

今天给大家安利一款席卷B站&#xff0c;火爆全网的游戏——《植物大战僵尸杂交版》2.0.88整合包。 这个是网络上现存植物大战僵尸杂交版的最全整合&#xff0c;包含了修改工具&#xff0c;超强通关存档和高清工具。工具包有安装视频教程&#xff0c;支持手机版和pc多端使用&am…

家用洗地机前十名排行榜:2024十大热销款式好用不踩雷

洗地机强大的清洁力和高效的清洁效率&#xff0c;迅速代替了吸尘器、电动拖把、蒸汽拖把的位置&#xff0c;成为家庭地面清洁的新宠&#xff0c;各大厂商也纷纷上新自家新品。但是这个也造成了人们在挑选机型的时候无从下手&#xff0c;甚至很多新手购机&#xff0c;几乎对洗地…

Typora 破解、激活!亲测有效!2024 最新激活方法

Typora 破解、激活&#xff01;亲测有效&#xff01;2024 最新激活方法 Typora是一款简单易用的Markdown编辑器。 Markdown是一种可以使用普通文本编辑器编写的标记语言&#xff0c;通过简单的标记语法&#xff0c;它可以使普通文本内容具有一定的格式&#xff0c;其目标是实现…

【Intel CVPR 2024】通过图像扩散模型生成高质量360度场景,只需要一个语言模型

在当前人工智能取得突破性进展的时代&#xff0c;从单一输入图像生成全景场景仍是一项关键挑战。大多数现有方法都使用基于扩散的迭代或同步多视角内绘。然而&#xff0c;由于缺乏全局场景布局先验&#xff0c;导致输出结果存在重复对象&#xff08;如卧室中的多张床&#xff0…

[AIGC] 深入理解Java Map接口

深入理解Java Map接口 Java Map提供了一个存储键值对的数据结构&#xff0c;键是唯一的&#xff0c;但值可以重复。在Java中&#xff0c;Map接口是java.util包中的一部分&#xff0c;它定义了操作映射的方法。本篇文章将介绍Java Map接口中的常用API。 Map接口常用方法 以下…

Web前端限制下载速度:深入探索与实现策略

Web前端限制下载速度&#xff1a;深入探索与实现策略 在Web前端开发中&#xff0c;限制下载速度的需求可能源于多种场景&#xff0c;如节省带宽、控制资源消耗或模拟网络延迟等。然而&#xff0c;这一需求在技术上却带来了不小的挑战。本文将从四个方面、五个方面、六个方面和…

Armbian OS(基于ubuntu24) 源码编译mysql 5.7

最近弄了个S905X3的盒子刷完Armbian OS &#xff08;基于ubuntu24&#xff09;&#xff0c;开始折腾Arm64之旅。第一站就遇到了MySQL的问题&#xff0c;由于MySQL没有提供Arm64版本&#xff0c;又不想塞Docker镜像&#xff0c;因此选择源码来编译MySQL5.7。下面记录详细过程和遇…

Golang的GC

目录 介绍GC 概要 什么是根对象 三色标记法 什么情况下三色标记法会失效 屏障机制 “强-弱” 三色不变式 插入屏障 (强三色) 删除屏障(弱三色) Go 的混合写屏障机制 混合写屏障规则 介绍GC 概要 作用范围&#xff1a;只回收堆内存&#xff0c;不回收栈内存&#xf…

EtherCAT主站SOEM -- 31 -- STM32F767-SOEM从站IO模块采集DI及输出DO

EtherCAT主站SOEM -- 31 -- STM32F767-SOEM从站IO模块采集DI及输出DO 0 QT-SOEM及STM32F767-SOEM视频欣赏及源代码链接:0.1 QT-SOEM博客、视频欣赏及源代码链接0.2 STM32F767-SOEM 博客、视频欣赏及源代码链接1 程序文件修改替换1.1 allvalue.h1.2 allvalue.c1.3 motrorcontro…