Future取消线程执行

【README】

本文总结于 《java并发编程实战》 page121,非常棒的一本书;


【1】Future

1,介绍:future 用于管理任务的生命周期,处理异常,以及实现取消;

2,future.cancel() 取消方法有一个boolean类型的参数  mayInterruptIfRunning, 表示取消操作是否成功;如果为ture,并任务当前正在某个线程中执行,则该线程能被中断;

【1.1】例子:

通过 future.cancel(true) 中断任务所属线程;

/*** @Description future取消任务测试* @author xiao tang* @version 1.0.0* @createTime 2022年02月20日*/
public class FutureCancelTest {static ExecutorService executorService = Executors.newFixedThreadPool(3);public static void main(String[] args) throws Exception {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("【子线程】任务开始运行");while(!Thread.currentThread().isInterrupted()) {try {System.out.println("【子线程】睡眠3秒");TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {System.out.println("【子线程】抛出中断异常");Thread.currentThread().interrupt(); // 重置中断状态 tag2 }}System.out.println("【子线程】任务结束");}};timeRun(runnable, 1, TimeUnit.SECONDS);// 关闭线程池executorService.shutdown();System.out.println("【主线程】关闭线程池");}static void timeRun(Runnable r, long timeout, TimeUnit timeUnit) throws Exception {Future<?> future = executorService.submit(r);try {System.out.println("【主线程】调用get() 阻塞");future.get(timeout, timeUnit);} catch (TimeoutException e1) {System.out.println("【主线程】超时异常");} catch (ExecutionException e2) {System.out.println("【主线程】任务执行异常");throw e2;} finally {System.out.println("【主线程】取消任务");future.cancel(true); // 如果任务正在运行,那么将被中断  tag1}}
}

打印结果:

【主线程】调用get() 阻塞
【子线程】任务开始运行
【子线程】睡眠3秒
【主线程】超时异常
【主线程】取消任务
【子线程】抛出中断异常
【子线程】任务结束
【主线程】关闭线程池

【代码解说】

tag1的代码,取消任务,传入的参数为true,则会中断任务所属线程,即设置该子线程的中断状态为true;

  • 情况1)如果这个时候子线程调用 中断式阻塞方法,如sleep,join等,则java底层会抛出中断异常,且清空中断状态(即设置为false); 如果 删除tag2(重置中断状态为true) 的代码,那么循环不会结束,子线程无法正常结束,所以需要tag2;
  • 情况2)如果这个时候 子线程没有调用中断式阻塞方法,这个时候 while循环条件不满足(因为这个时候线程中断状态为true),所以子线程退出循环;

无论怎样,只要保证 tag2代码存在,不管是哪一种情况,总是可以使得子线程运行结束(任务运行结束);

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

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

相关文章

Nancy之结合tinyfox给我们的应用提供简单的数据服务

说到提供数据服务给我们的一些应用&#xff0c;估计用的最多的也就是json和xml这两种数据格式 实现的方法也是多种多样&#xff0c;web api,mvc的jsonresult和contentresult...等等 本文是结合Nancy、TInyFox、Owin等来实现的 一、前提工作 新建一个空的web应用程序 添加相应的…

javaweb调用python算法_请教怎么用java远程调用python? 多谢

请问如何用java远程调用python? 谢谢&#xff01;本帖最后由 blackkettle 于 2015-05-07 13:00:41 编辑比如有一台机器 A上安装了python, 另一台机器B要用java 调用A 上的python的某个函数&#xff0c;输入数据在B机器上&#xff0c;所有的计算在A机器完成&#xff0c;结果返回…

(转)如何查看java本地方法

在线查看本地代码&#xff0c; refer2 http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/os/linux/vm/os_linux.cpp 我们知道在java中查看java源码时看到native方法在java层面上就到头的&#xff0c;如果还想继续往下看就需要看jdk是如何实现的&#xff0c;今天就分…

统一配置中心的设计方案

转载自 统一配置中心的设计方案对于配置文件&#xff0c;我们不陌生&#xff0c;它提供我们可以动态修改程序运行能力。引用别人的一句话就是&#xff1a;系统运行时(runtime)飞行姿态的动态调整。我可以把我们的工作称之为在快速飞行的飞机上修理零件。我们人类总是无法掌控和…

微软CEO纳德拉恢弘计划:让开发者始终忘不了微软

BI中文站 4月11日 报道 当微软前CEO史蒂夫•鲍尔默&#xff08;Steve Ballmer&#xff09;在2000年喊出“开发者&#xff0c;开发者&#xff0c;开发者”的口号时&#xff0c;他可能有点儿激动&#xff0c;但是他的观点是对的。 30年前当Windows 1.0推出的时候&#xff0c;这种…

python scratch unity_Unity3D研究院之2D游戏开发制作原理(二十一)

经过了4个月不懈的努力&#xff0c;我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了。这里MOMO先打一下广告&#xff0c;图灵的出版社编辑成员都非常给力&#xff0c;尤其是编辑小花为这本书付出了很大的努力&#xff0c;还有杨海玲老师&#xff0c;不然我也无法完成这…

原码补码与反码

【README】 1.本文内容总结自“哈工大刘宏伟”老师的mooc视频《计算机组成原理》on bilibili&#xff1b; 2.为了便于理解&#xff0c;本文引入了逗号分割符号部分和数值部分&#xff0c;计算机存储数据的时候没有逗号&#xff1b; 【1】原码表示法 原码定义&#xff1a; 原…

第一篇 Entity Framework Plus 之 Audit

一般系统会有登陆日志&#xff0c;操作日志&#xff0c;异常日志&#xff0c;已经满足大部分的需求了。但是有时候&#xff0c;还是需要Audit 审计日志&#xff0c;审计日志&#xff0c;主要针对数据增&#xff0c;改&#xff0c;删操作数据变化的记录&#xff0c;主要是对数据…

本想试试看,结果却拿到了京东的Offer

转载自 本想试试看&#xff0c;结果却拿到了京东的Offer 最近&#xff0c;春招已经基本接近尾声了&#xff0c;我找了几位拿到名企Offer的粉丝&#xff0c;请他们总结了面试经验&#xff0c;近期会分批的推送给大家。希望给那些正在准备秋招的同学提供些帮助。 今天给大家分享的…

ping 命令使用代理_网络检测知识篇:ping命令使用知识,你知道几点?

Ping命令其实是一个非常好的网络故障诊断工具&#xff0c;相信阅读完本文对大家一定有些帮助。如果大家网络遇到问题&#xff0c;不妨试试以下方法。首先使用Ping命令诊断本地TCP/IP协议是否安装正常&#xff0c;检测方法如下&#xff1a;从电脑开始里找到运行&#xff0c;快捷…

8.4-中断系统小结(cpu中断七个问题)

【README】 本文转自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】中断介绍 1&#xff09;作用&#xff1a;用中断系统实现了外设数据的输入输出&#xff1b; 还可以用于程序调试&…

第二篇 Entity Framework Plus 之 Query Future

从性能的角度出发&#xff0c;能够减少 增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0c;跟数据库打交道次数&#xff0c;肯定是对性能会有所提升的&#xff08;这里单纯是数据库部分&#xff09;。 今天主要怎样减少Entity Framework查询跟数据库打交道的次数&#…

python长整数相乘_python写的大整数相乘的方法

输入72106547548473106236 982161082972751393 两个大整数输出结果70820244829634538040848656466105986748解题思路首先根据 大整数相乘的原理的基础上&#xff0c;把大整数进行优化拆分&#xff0c;拆分的长度&#xff0c;要考虑语言中整形的长度。这里用的python&#xff0c…

Java Web应用的代码分层最佳实践

转载自 Java Web应用的代码分层最佳实践代码分层&#xff0c;对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚&#xff0c;还可以使项目分工更加明确&#xff0c;可读性大大提升&#xff0c;更加有利于后期的维护和升级。从另外一个角…

中断屏蔽技术

【README】 本文总结自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】中断屏蔽 1&#xff0c;中断屏蔽的意思是&#xff0c;在中断1的服务程序执行过程中&#xff0c;不允许被其他中断…

.NET FM的未来计划

2016年3月21日&#xff0c;我们启动了.NET FM这档独立播客来服务中文.NET和微软技术社区。如同早先感谢信所言&#xff0c;能够得到社区的肯定和全力支持&#xff0c;二位主播是受宠若惊。关于未来的计划&#xff0c;下面简单和大家分享一下。 首先&#xff0c;关于节目播出频率…

Java开发必须掌握的日志分析命令

转载自 Java开发必须掌握的日志分析命令 对于大型网站来说&#xff0c;很多网站在可用性方面提出4个9或者5个9的要求&#xff0c;如果是4个9&#xff0c;那么网站全年的不可用时间不能超过52.6分钟&#xff0c;如果是5个9&#xff0c;全年不可用时间不能超过5.2分钟。这其实是很…

指令寻址方式与数据寻址方式

【README】 1.本文总结自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 2. cpu访存寄存器耗费 10ns&#xff0c;访问缓存&#xff08;高速缓冲寄存器&#xff09;耗费20ns&#xff0c;访问主…

python oj 输入_Python写OJ题时输入问题

# encoding: utf-8Created on Nov 6th, 2014author: SpeedcellPython的输入是野生字符串&#xff0c;所以要自己转类型strip去掉左右两端的空白符&#xff0c;返回strslipt把字符串按空白符拆开&#xff0c;返回[str]map把list里面的值映射到指定类型&#xff0c;返回[type]EOF…

本地缓存的原理及技术选型参考

转载自 本地缓存的原理及技术选型参考互联网架构设计的五大要素&#xff1a;高性能、高可用、可伸缩性、可扩展性、安全。如何做到高性能、高可用&#xff0c;缓存是一大助力。我们知道&#xff0c;绝大部分的时候&#xff0c;读数据写数据符合二八定律。并且读数据中&#xff…