当前位置: 首页 > news >正文

FutureTask通常如何使用?

FutureTask 是一种有用的工具,用于管理并发编程中可取消的、可监听的任务。它通常被用来包装 CallableRunnable 对象,并在单独的线程中执行这些任务。以下是一些使用 FutureTask 的典型场景和步骤:

1. 包装 CallableRunnable

下面是基本的包装 CallableRunnable 的方法:

// 使用 Callable
Callable<Integer> callable = () -> {// 模拟长时间的任务Thread.sleep(1000);return 123;
};FutureTask<Integer> futureTask = new FutureTask<>(callable);// 使用 Runnable
Runnable runnable = () -> {// 模拟长时间的任务try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}
};
FutureTask<Void> futureTask2 = new FutureTask<>(runnable, null);

2. 提交任务

可以通过 ThreadExecutorService 提交 FutureTask 并执行任务:

通过 Thread
Thread thread = new Thread(futureTask);
thread.start();
通过 ExecutorService
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
executor.shutdown();

3. 获取结果

使用 FutureTaskget 方法可以获取任务的执行结果:

try {Integer result = futureTask.get();System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}

如果需要带超时限制的获取,可以使用带超时参数的 get 方法:

try {Integer result = futureTask.get(500, TimeUnit.MILLISECONDS);System.out.println("Result with timeout: " + result);
} catch (TimeoutException e) {System.out.println("Task timed out");
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}

4. 取消任务

可以使用 cancel 方法取消任务,如果任务正在运行,你可以选择是否允许中断:

boolean mayInterruptIfRunning = true;
futureTask.cancel(mayInterruptIfRunning);if (futureTask.isCancelled()) {System.out.println("Task was cancelled");
} else {System.out.println("Task was not cancelled");
}

5. 完整示例

下面是一个完整的示例,展示如何使用 FutureTask 包装一个 Callable 任务,并通过 ExecutorService 提交任务执行,同时获取结果并处理取消:

import java.util.concurrent.*;public class FutureTaskExample {public static void main(String[] args) {// 创建一个 Callable 对象Callable<Integer> callable = () -> {System.out.println("Task started");Thread.sleep(2000); // 模拟长时间任务System.out.println("Task completed");return 123;};// 创建 FutureTaskFutureTask<Integer> futureTask = new FutureTask<>(callable);// 使用 ExecutorService 提交 FutureTaskExecutorService executor = Executors.newSingleThreadExecutor();executor.submit(futureTask);// 主线程可以执行其他任务System.out.println("Main thread is doing something else");try {// 获取任务的结果Integer result = futureTask.get(1, TimeUnit.SECONDS);System.out.println("Result from FutureTask: " + result);} catch (InterruptedException e) {System.out.println("Task was interrupted");} catch (ExecutionException e) {System.out.println("Task encountered an execution exception");} catch (TimeoutException e) {System.out.println("Task timed out");futureTask.cancel(true); // 取消任务System.out.println("Task was cancelled: " + futureTask.isCancelled());} finally {// 关闭 Executor 服务executor.shutdown();}}
}

在这个示例中,FutureTask 包装一个 Callable 对象,并由 ExecutorService 执行。主线程可以执行其他任务,并通过 futureTask.get() 方法获取任务结果。超时发生时任务会被取消。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ethercat设备数据 转IEC61850项目案例
  • django学生就业管理系统—计算机毕业设计源码24237
  • ★ 算法OJ题 ★ 力扣11 - 盛水最多的容器
  • qtlinux
  • MySQL中的COALESCE()函数用法,返回第一个非 NULL 的参数
  • 什么是数字人
  • How to install mysql 5.7 with podman in Ubuntu 24.04
  • CMake基本语法大全
  • c++同人小游戏之斗罗大陆4
  • 书生浦语实训营-InternVL 多模态模型部署微调实践
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • Unity(2022.3.41LTS) - 脚本
  • react + ts + material-ui V5版本的table封装
  • 本地部署aniportrait
  • 【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器
  • Apache Pulsar 2.1 重磅发布
  • Debian下无root权限使用Python访问Oracle
  • Java编程基础24——递归练习
  • Next.js之基础概念(二)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 爱情 北京女病人
  • 从零开始学习部署
  • 高度不固定时垂直居中
  • 经典排序算法及其 Java 实现
  • 如何用vue打造一个移动端音乐播放器
  • 入门级的git使用指北
  • 使用docker-compose进行多节点部署
  • 思维导图—你不知道的JavaScript中卷
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 数据结构
  • #include
  • #nginx配置案例
  • #NOIP 2014# day.2 T2 寻找道路
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (+4)2.2UML建模图
  • (AngularJS)Angular 控制器之间通信初探
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (Ruby)Ubuntu12.04安装Rails环境
  • (windows2012共享文件夹和防火墙设置
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (含笔试题)深度解析数据在内存中的存储
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Micro Framework初体验(二)
  • .net 获取url的方法
  • .NET6 命令行启动及发布单个Exe文件
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @拔赤:Web前端开发十日谈
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • []sim300 GPRS数据收发程序