Java并发编程中的FutureTask详解

ops/2024/10/22 5:04:37/

Java并发编程中的FutureTask详解

    • 1、核心特点
    • 2、基本用法
      • 2.1 包装 Callable 任务
      • 2.2 包装 Runnable 任务
    • 3、注意事项


💖The Begin💖点点关注,收藏不迷路💖

FutureTask 是 Java 并发java.util.concurrent 中的一个类,它实现了 Future 接口,并提供了异步执行计算任务的能力。

1、核心特点

  • 异步执行:允许你提交任务进行异步执行,主线程可以继续执行其他任务。
  • 结果获取:通过 get() 方法获取任务执行的结果,如果任务未完成,则当前线程会阻塞。
  • 可取消:可以尝试取消任务的执行,如果任务已启动且允许中断,则任务执行线程会被中断。
  • 任务检查:通过 isDone() 方法检查任务是否已完成。

2、基本用法

2.1 包装 Callable 任务

当你有一个返回结果的计算任务时,可以使用 Callable 接口。FutureTask 可以包装 Callable 任务,并提供异步执行的能力。

Callable<Integer> task = () -> {  // 模拟耗时计算  return 123;  
};  FutureTask<Integer> futureTask = new FutureTask<>(task);  
ExecutorService executor = Executors.newSingleThreadExecutor();  
executor.submit(futureTask);  // 等待任务完成并获取结果  
try {  Integer result = futureTask.get();  System.out.println("结果: " + result);  
} catch (Exception e) {  e.printStackTrace();  
}  executor.shutdown();

2.2 包装 Runnable 任务

对于不返回结果的 Runnable 任务,FutureTask 的 get() 方法将返回 null。

Runnable task = () -> {  // 模拟耗时操作  
};  FutureTask<?> futureTask = new FutureTask<>(task, null);  
ExecutorService executor = Executors.newSingleThreadExecutor();  
executor.submit(futureTask);  try {  // 等待任务完成,但不获取结果  futureTask.get();  
} catch (Exception e) {  e.printStackTrace();  
}  executor.shutdown();

3、注意事项

1、使用 get() 方法时,注意处理 ExecutionException。

2、调用 cancel(true) 时,任务可能因不响应中断而无法被取消。

3、使用完 ExecutorService 后,记得关闭它以释放资源。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

http://www.ppmy.cn/ops/89008.html

相关文章

小蓝的二进制询问(河南萌新2024)(河南农业大学)

D-小蓝的二进制询问_河南萌新联赛2024第&#xff08;一&#xff09;场&#xff1a;河南农业大学 (nowcoder.com) #include <bits/stdc.h>using namespace std; typedef long long ll; typedef double db; typedef long double ldb; typedef pair<int, int> pii; t…

MLOPS工具集教程-快速入门MLflow

文章目录 一、什么是 MLOps&#xff1f;二、MLOps 工具有什么作用&#xff1f;三、免费开源 MLOps 工具和平台——MLflow3.1 MLflow介绍3.2 安装MLflow3.3启动MLflow3.4 API文档3.5 训练模型演示实例 MLOps 策略越来越多地应用于机器学习模型以及构建这些模型的团队中&#xff…

World of Warcraft [RETAIL] UI Setting

/*测试魔兽世界正式服&#xff0c;界面UI编辑器&#xff0c;UI布局文本 World of Warcraft [RETAIL] UI Setting开头的&#xff1a;1 39 某种类型 &#xff1a; 序号&#xff08;默认-1&#xff0c;有多个从0开始计数0,1,2,3 未知类型 未知类型 未知类型 控件类型&#xff1…

VUE2项目打包dist后dist包中index打开空白页

报错&#xff1a;控制台报错是未找到对应资源路径 原因&#xff1a;因为在项目中部分路径使用了./ 和 / 等绝对路径 解决方法&#xff1a; 删除原来的dist 在 vue.config.js 中设置 publicPath 选项&#xff0c;使其适应不同环境。 重新新打包&#xff1a;npm run build // vue…

MHA高可用配置及故障切换

目录 MHA高可用配置及故障切换 MHA定义 MAH的组成 MHA特点 MHA工作原理 实验&#xff1a;搭建MySQL MHA 案例拓扑图 案例实施 四台服务器关闭防火墙防护&#xff0c;连接所有会话101、102、103、104 设置host文件 安装MySQL数据库 连接会话102、103、104 设置主库配…

C#列表按照日期进行从大到小排序

C#列表按照日期进行从大到小排序

05 Go 语言中的函数和方法到底有什么不同

上一讲的思考题是创建一个二维数组并使用。上节课&#xff0c;我主要介绍了一维数组&#xff0c;其实二维数组也很简单&#xff0c;仿照一维数组即可&#xff0c;如下面的代码所示&#xff1a; aa:[3][3]int{} aa[0][0] 1 aa[0][1] 2 aa[0][2] 3 aa[1][0] 4 aa[1][1] 5 aa[1][…

【C++高阶】:C++11的深度解析上

✨ 心似白云常自在&#xff0c;意如流水任东西 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f4…