FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗

Java FutureTask本质解析:任务状态契约与假异步陷阱 FutureTask是Java并发中连接Callable、ExecutorService和Future的核心契约实现,其本质并非异步工具,而是一个具备状态机(NEW→COMPLETING→NORMAL/EXCEPTIONAL)的可执行任务容器。它通过AtomicInteger管理生命周期,用WaitNode链表+LockSupport.park实现get()阻塞,但所有阻塞行为均取决于state字段而非线程调度。正因如此,未配合超时的get()极易引发线程池耗尽,而isDone()仅表示任务终结(含失败/取 阅读详情

		ExecutorService executor = Executors.newSingleThreadExecutor();
		FutureTask<?> futureTask = new FutureTask<String>(new Callable<String>() {
			@Override
			public String call() throws Exception {
				for(int i=0;i<10000;i++){
					System.out.println(i);
				}
				return null;
			}
		});
		executor.execute(futureTask);
		System.out.println("futureTask start");
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		futureTask.cancel(true);
		System.out.println("futureTask cancel");
	}

我们先来看看这个例子,发现最终执行结果是9999,即异步任务并没有被cancel而是一直执行完毕,这样看来这个cancel方法有点名不副实啊。

其实我们如果查看FutureTask的源码就会发现cancel只不过是调用了Thread的interrupt方法,而interrupt只能是停掉线程中有sleep,wait,join逻辑的线程,抛出一个InterruptException。这样看来FutureTask的cancel方法并不能停掉一切正在执行的异步任务。但是这里我们有一个妥协的做法就是在判断条件中加!Thread.currentThread().isInterrupted()这个判断即可

ExecutorService executor = Executors.newSingleThreadExecutor();
		FutureTask<?> futureTask = new FutureTask<String>(new Callable<String>() {
			@Override
			public String call() throws Exception {
				for(int i=0;i<10000&&!Thread.currentThread().isInterrupted();i++){
					System.out.println(i);
				}
				return null;
			}
		});
		executor.execute(futureTask);
		System.out.println("futureTask start");
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		futureTask.cancel(true);
		System.out.println("futureTask cancel");

最终这个就可以真正的结束异步任务。

  到这里我们可以发现Java中并没有可以真正中断线程的方法,早期的stop已经不推荐使用,而interrupt方法也需要代码片段中有sleep,wait,join这些方法的调用,否则不能停止线程,现在java推荐的方式就是将run方法执行完,这就需要我们在while循环中加一个标志来控制退出,不过我们不需要额外设置这个标志,只需要调用thread的isInterrupted()方法判断,这样外界就可以调用该线程的isInterrupted方法来停止现在了,不用额外添加标志。

Future与FutureTask核心原理:从异步结果到工程实践与超时坑点 并发编程中,异步执行与结果获取是绕不开的两大核心问题。线程池作为后端高性能的基础设施,通过ExecutorService提交Callable任务,即可拿到Future凭证实现非阻塞查询。FutureTask内部基于状态机与LockSupport.park挂起/唤醒线程,是Java并发包中重要的任务单元。合理封装异步结果能有效解决接口串行聚合慢、线程资源浪费等问题,在微服务调用、多数据源查询等场景下可显著降低RT。但工程实践中仍需警惕get()阻塞无超时、超时后未cancel、异常被吞等典型风险,并考虑使用E 阅读详情

相关推荐

手把手教你用X-AnyLabeling实现医学图像标注:从SAM模型选择到多边形优化全流程

本文详细介绍了如何使用X-AnyLabeling平台结合Med-SAM等专业模型实现医学图像的高效标注。从环境配置、模型部署到实战工作流,涵盖智能辅助标注、低对比度解决方案及团队协作方案,帮助医疗从业者大幅提升标注效率与质量。特别适合处理CT/MRI等医学影像的复杂标注需求。

weixin_29251131的博客 457

并发编程:执行器:7、取消任务(future.cancel())

future.cancel() 在执行器内取消任务

博风_刺耳的博客(网络记事本) 1万+

claude使用教程

提供了三种模型:claude,codex, gemini,三种模型都共用同一个apikey, 有开发需求使用claude效果较好,知识问答等场景gemini效果会更好些,本文只提供了claude的安装方式,剩下两种按需按照以下参考链接安装下即可,安装有问题参考文档:https://www.aicodemirror.com/dashboard/official-installation/macos-linux (不需要挂梯子,自己手机号注册就好)

lichao19871216的博客 3501

Future取消线程执行

【README】 本文总结于 《java并发编程实战》 page121,非常棒的一本书; 【1】Future 1,介绍:future 用于管理任务的生命周期,处理异常,以及实现取消; 2,future.cancel() 取消方法有一个boolean类型的参数 mayInterruptIfRunning, 表示取消操作是否成功;如果为ture,并任务当前正在某个线程中执行,则该线程能被中断; 【1.1】例子: 通过 future.cancel(true) 中断任务所属线程; /** * @.

PacosonSWJTU的博客 5502

比亚迪唐/秦开发者必看:253个车辆接口实战指南(附常用功能调用示例)

本文为比亚迪唐/秦开发者提供了一份详尽的车辆接口实战指南。文章聚焦于比亚迪开放的253个车辆接口,从开发环境搭建、核心状态监控到高频控制功能(如空调与充电管理),结合真实代码示例,帮助开发者快速上手并规避常见问题,高效开发车载应用。

weixin_28327051的博客 613

腾讯开源SuperSonic:AI+BI如何重塑数据分析?

SuperSonic是腾讯开源的AI+BI平台,融合Chat BI与Headless BI,为制造企业提供实时数据分析。它通过自然语言交互打破数据壁垒,实现生产、库存、质量、供应链等多环节优化,提升决策效率,其开源生态与扩展性助力企业数字化转型与数据价值挖掘。

数据与算法架构提升之路专栏 4542

java多线程Future.cancel(true)取消线程,线程还是会执行catch与finally里面的代码,只要资源回收的代码没有乱写,不必担心资源回收问题

java多线程Future.cancel引发的疑问

DL_jianglin的博客 2851

Android 15.0 首次开机默认授予app运行时权限(去掉运行时授权弹窗)

在15.0的系统rom产品定制化开发中,在6.0以后对于权限的申请,都需要动态申请,所以会在系统首次启动后,在app的首次运行时, 会弹出授权窗口,会让用户手动授予app运行时权限,在由于系统产品开发需要要求默认授予app运行时权限,不需要用户默认授予运行时弹窗,所以需要在首次开机默认授予所有app运行时权限

安卓兼职framework和app工程师的博客 1204

关于Future.cancel(false)

https://blog.youkuaiyun.com/StefanTimber/article/details/73823689 前言 在学习Future接口的过程中,注意到它具有一个cancel()方法,用于取消异步的任务,它传入一个boolean类型的参数,传入true会中断线程停止任务,而传入false则会让线程正常执行至完成,并返回false。  由此让我产生了疑问,false参数并不会停止任务,...

z69183787的专栏 2887

MAC(m1)-VMWare Fusion安装CentOS7.9

MAC(m1)-VMWare Fusion安装CentOS7.9

兴趣是最好的老师 1769

后台管理系统-7-vue3之引入配置文件baseURL

mock=false,本地模拟。mock=true,线上模拟。baseURL+url=实际请求的URL。get请求param参数,post请求data参数。

qq_20466211的博客 208

取消正在执行的线程

开一个线程,执行一个任务:计算1000000033是不是质数,2秒后取消这个任务。真的是:不试不知道,一试吓一跳!!!

知道这个有什么用? 1257

R语言中的混淆矩阵(Confusion Matrix)是一种常用的评估多分类模型性能的工具

除了准确率,混淆矩阵还提供了其他有用的指标,如灵敏度(Sensitivity)、特异度(Specificity)、精确度(Precision)和召回率(Recall)。混淆矩阵通过比较模型预测结果与实际标签的一致性,帮助我们了解模型的分类准确性和错误类型。此外,混淆矩阵还提供了各种错误类型的统计信息,如假阳性(False Positive)和假阴性(False Negative)等。通过混淆矩阵,我们可以了解模型的整体性能和错误类型,从而对模型进行评估和改进。最后,为了更好地理解混淆矩阵的结果,可以使用。

HackSquad的博客 972

FutureTask详解

Future接口和实现Future接口的FutureTask类,代表异步计算的结果。 FutureTask简介 FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给 Executor执行,也可以由调用线程直接执行(FutureTask.run())。根据FutureTask.run()方法被执行 的时机,FutureTask可以处于下...

田野中的锋芒 6380

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

yuzu Switch 模拟器快速上手指南:从零配置到跑通首个游戏的完整教程

yuzu 是一款开源的任天堂 Switch 模拟器,能把卡带与数字版游戏搬到 Windows、Linux 和 Android 上运行。本文写给第一次装它的新手:备齐密钥、固件和游戏文件,按顺序做四组操作,顺利的话一小时内进游戏。 ## 先说它是干嘛的 yuzu 用 C++ 完整复刻了 Switch 的 CPU 执行、系统服务和 GPU 指令翻译,让主机上的游戏在 PC 里跑起来。它由 Citr

gitblog_00122的博客 219

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java futuretask_java多线程——FutureTask的用法

之前介绍了线程池相关的对象,Runable Callable与Future,下面介绍FutureTask的作用,它的特性是怎样的呢?FutureTask特点先看FutureTask的类图:从上图我们可以看到FutureTask实现了RunableFuture接口,同时RunableFuture又继承Future,Runable接口,也就是说FutureTask具备Runbale的run方法执行异步...

weixin_42509105的博客 399

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java多线程 Future和FutureTask的区别

Java多线程 Future和FutureTask的区别

Yeats_Liao的博客 4478

java8 FutureTask、Future、Callable、Runnable区别总结

文章目录一、Callable与Runnable的区别二、Future接口三、FutureTask详解1.构造方法2、run()3、get()4、cancel() 一、Callable与Runnable的区别 Callable和Runnable都是接口,而且都只有一个方法。它们都是用于多线程环境下。 Runnable只有一个run方法,实现类在run方法中定义线程需要完成的任务,它作为Thread构造函数的入参,线程启动后执行run方法。Runnable的run方法没有返回值,所以如果需要线程返回值的话,Ru

龚厂长的博客 1192

FutureTask源码完整解读

文章目录1 简介2 用法示例3 实现原理1) 成员变量2) 构造方法3) 主要API(1) run与runAndReset(2) get方法(3) cancel方法(4) 其他辅助方法 1 简介 上一篇博客“异步任务服务简介”对FutureTask做过简要介绍与分析,这里再次对FutureTask做一次深入的分析(基于JDK1.8)。 FutureTask同时实现了Future 、Runnable...

小伍的程序之路 537

java future用法_java多线程——FutureTask的用法

之前介绍了线程池相关的对象,Runable Callable与Future,下面介绍FutureTask的作用,它的特性是怎样的呢?FutureTask特点先看FutureTask的类图:​从上图我们可以看到FutureTask实现了RunableFuture接口,同时RunableFuture又继承Future,Runable接口,也就是说FutureTask具备Runbale的run方法执行异...

weixin_39893042的博客 225

Java 带执行结果的线程(Callable 、 Future 与 FutureTask)

二、Callable Callable和Future,一个产生结果,一个拿到结果。 Callable接口中只有一个call()方法,和Runnable相比,该方法有返回值并允许抛出异常。 方法 描述 V call() 计算结果,如果无法执行则抛出异常。 二、Future Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行...

书香水墨 289

futuretask

FutureTask源码解析 第一部分:What 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。本文会简要的介绍使用方法,然后会从源代码角度分析下具体的实现原理。 本文以Java 1.7的代码进行分析。 第二部分:How Callable接口 对于需要执行的任务需要实现Callable接

u014162993的博客 167

ScheduledThreadPoolExecutor 与 FutureTask:定时任务与异步编排,顺带认识 CompletableFuture

前面三篇讲的都是"普通"线程池——任务提交上去就立刻排队等着被执行。这篇讲两个更"特殊"的话题:一个是专门做延迟、周期性任务的 `ScheduledThreadPoolExecutor`;另一个是 `FutureTask`——从 Day02 讲 `Callable` 时就提到过它,这次把它的状态机和阻塞原理讲透,顺带认识一下更现代的异步编排工具 `CompletableFuture`。

NPE2.0的博客 416

多线程高并发编程(7) -- Future源码分析

一.概念   A Future计算的结果。 提供方法来检查计算是否完成,等待其完成,并检索计算结果。 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪。 取消由cancel方法执行。 提供其他方法来确定任务是否正常完成或被取消。 计算完成后,不能取消计算。 如果您想使用Future ,以便不可撤销,但不提供可用的结果,则可以声明Future<?>表格的...

欢迎点赞 + 关注,开源项目见下方栏目 1万+

FutureTask源码分析

什么是Future? 从字面上来看,Future表示将来的意思,也就是说现在执行某个任务可能是不能立即拿到返回值,在将来的某个时间点 当task执行完毕也就可以拿到了;那么这个返回值在哪呢?就封装在future中(实现类) Future 最主要的作用是,比如当做一定运算的时候,运算过程可能比较耗时,有时会去查数据库,或是繁重的计算,比如压缩、加密等,在这种情况下,如果我们一直在原地等待方法返回,显然是不明智的,整体程序的运行效率会大大降低。我们可以把运算的过程放到子线程去执行,再通过 Future 去控制子

持之以恒 370
上一篇: 测试页面刷新帧率的python脚步
下一篇: Looper.myQueue().addIdleHandler,在activty界面显示后做一些事情,就在这个idlehandler中做
宇宙小生命
博客等级 码龄15年 21粉丝 36原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值