JAVA并发编程(四)任务的取消与关闭

BGP邻居状态机(FSM)排错指南:从Idle到Established的常见故障与修复(附华为/思科命令) 本文深入解析BGP邻居状态机(FSM)从Idle到Established的完整流程,提供华为和思科设备的排错命令与配置示例。针对各状态转换阶段的典型故障(如TCP连接失败、Open报文错误等),给出具体诊断方法和修复方案,涵盖报文分析、路由策略检查等高级技巧,帮助网络工程师快速定位和解决BGP邻居建立问题。 阅读详情

概述

之前三篇文章介绍了多线程的同步,加锁机制,同步容器,并发容器,以及多线程工具类,线程池等。

详细内容请看 线程池  内置锁与多线程数据共享 线程安全工具类 

大多数时候,我们会让线程运行直到结束。然而,有时候我们希望提前结束任务,或者因为用户取消了操作,需要终止线程。我们来看一下如何使一个线程安全、快速、可靠的停下来。

任务取消的原因

1、用户主动取消。如点击图形界面的取消按钮等。

2、有时间限制的操作。当超过时间限制时,需要结束任务。

3、应用程序事件。当一个任务找到解决方案时,需要结束操作。

4、出现错误。当任务执行过程中出现不可恢复的错误,需要结束任务。

5、关闭。当一个程序被关闭时,需要做一些清理操作。

使用简单标志位保存取消状态

为了保证标志位可靠,标志必须为volatile类型。
/**
 * 
 * @author chao
 *
 */
public class SafeCancel extends Thread {
	private volatile boolean cancelled;

	@Override
	public void run() {
		while (!cancelled) {
			// todo something
		}
	}

	public void cancel() {
		cancelled = true;
	}
}
一个可取消的任务必须拥有取消策略。这个策略需要详细定义如何取消改任务,何时检查是否已经取消以及在响应取消请求之后该执行哪些操作。

中断

使用标志位来取消任务是不及时的,如果中间调用了阻塞方法,有可能永远都无法结束。
/**
 * 
 * @author chao
 *
 */
class InterruptCancel extends Thread {
	BlockingQueue<Object> queue = new LinkedBlockingQueue<>();

	@Override
	public void run() {
		try {
			while (!isInterrupted()) {
				Object info = new Object();
				// do something
				queue.put(info);
			}
		} catch (InterruptedException e) {
		}
	}

	public void cancel() {
		interrupt();
	}
}
每个线程都有一个boolean类型的中断状态,interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断状态,静态的interrupted方法将清除当前线程的中断状态,也是清除中断状态的唯一一个方法。

中断响应

当调用可中断的阻塞方法时,有两种策略可用于处理InterruptedException
1、传递异常,从而使你的方法也成为可中断的阻塞方法。
2、恢复中断状态,从而使调用栈上中的上层代码能够对其进行处理。
只有实现了线程中断策略的代码才可以屏蔽中断请求,常规任务中不应该屏蔽中断请求。

通过Future实现取消

private static ExecutorService service = Executors.newCachedThreadPool();

	public static void timedRun(Runnable r, long timeout, TimeUnit unit) {
		Future<?> task = service.submit(r);
		try {
			task.get(timeout, unit);
		} catch (InterruptedException | ExecutionException | TimeoutException e) {

		} finally {
			task.cancel(true);
		}
	}

关闭ExecutorService

ExecutorService提供了两种关闭方法:使用shutdown正常关闭,使用shutdownNow强行关闭。在进行强行关闭时,首先关闭当前正在进行的任务,然后返回所有尚未启动的任务清单。

处理未捕获的异常

Thread API提供了UncaughtExceptionHandler,检测出某个线程由于未捕获异常而终结的情况。在Android开发中,可以用来上报异常,发现问题及时修复。
Thread的方法
  public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler paramUncaughtExceptionHandler)
  {
    SecurityManager localSecurityManager = System.getSecurityManager();
    if (localSecurityManager != null) {
      localSecurityManager.checkPermission(new RuntimePermission("setDefaultUncaughtExceptionHandler"));
    }
    defaultUncaughtExceptionHandler = paramUncaughtExceptionHandler;
  }
  
  
  public static abstract interface UncaughtExceptionHandler
  {
    public abstract void uncaughtException(Thread paramThread, Throwable paramThrowable);
  }
  

Android中提供了另一个方法,单独设置每个线程的未捕获异常处理,更加灵活。
 public void setUncaughtExceptionHandler(UncaughtExceptionHandler handler) {
        uncaughtHandler = handler;
    }

JVM关闭钩子

在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。
  JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用:
1)程序正常退出
2)使用System.exit()
3)终端使用Ctrl+C触发的中断
4)系统关闭
5)使用Kill pid命令干掉进程




欢迎扫描二维码,关注公众号


C# 实现文件和字符串的AES加密解密 C# 实现文件和字符串的AES128加密解密 阅读详情

相关推荐

利用Android系统漏洞实现后台弹窗(外弹)

关键:从 Android 8.0(API 26)开始,禁止使用 context.sendBroadcast() 发送隐式广播(即没有指定 setPackage() 或明确组件的广播)。demo核心代码展示利用Android显示系统和广播系统的漏洞实现在后台弹窗的功能,支持最新Android15,16版本。核心功能都是在so层去做,大量使用了jni反调, 如果要上架到应用市场,需要对代码做进一步混淆,加固以应对市场安全扫描。3,开启虚拟显示窗口,这是个透明像素窗口。5,可开启一个线程,调用这个外弹窗口。

2018,再出发~ 1315

并发编程实战 - [任务执行、取消与关闭]

1、任务执行 1.1、Executor 1.1.1、线程池与Executor生命周期 Executor基于生产者-消费者模式,我们可以通过Executors的四个静态工厂方法创建线程池:newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool。这四个工厂方法其实都是通过Threa

json_it的博客 738

Ubuntu 22.04 LTS下Xenomai 3.3实时内核配置全攻略(附常见错误排查)

本文详细介绍了在Ubuntu 22.04 LTS系统上配置Xenomai 3.3实时内核的完整流程,包括环境准备、内核补丁应用、编译优化及常见错误排查。特别针对工业自动化和机器人控制场景,提供了性能优化建议和故障解决方案,帮助开发者实现毫秒级精度的实时任务处理。

weixin_29268385的博客 463

java取消_Java任务取消方案

image.png取消原因取消一个任务执行的理由有很多,通常有以下几个用户请求取消通常用户点击“取消”按钮发出取消命令有时间限制的操作计时任务,超时时就会取消任务执行并返回应用程序逻辑比如有多个任务对一个问题进行分解和搜索解决方案,如果其中某个任务找到解决方案,其他并行的任务就可以取消了发生错误比如爬虫程序下载网页到本地硬盘,如果盘满了之后爬取任务应该被取消关闭程序或服务被关闭,则正在执行的任务也...

weixin_30844301的博客 947

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6409

Unity 代码混淆<混淆插件(Obfuscator Pro 3.9.4)>

Unity 代码混淆<混淆插件(Obfuscator Pro 3.9.4)> 插件导入项目 导入后打开OPS/Obfuscator/Obfuscator Pro Settings 打开后可以看到界面如下 可以在上面界面中选择你需要混淆的类,方法,字段,属性,事件,参数。需要混淆的程序集的选择。如果有些程序集混淆后会有问题也可以添加到白名单里不被混淆 根据自己需求取选择 这个界面是是否添加添加随机代码的 如果使用了上面的插件可以使用 插件下载网址:https://download.cs

Xing_Cheng_Yun的博客 5098

如何正确地取消Java任务或服务?

引言 取消正在执行的任务、线程、服务,并不是那么容易。对于某个任务而言,为了支持取消操作,你不得不增加取消的代码,而且不一定支持阻塞;对于服务而言更是如此,你不清楚服务内部是依赖什么实现,所以就无法正常取消。(例如,内部可能是阻塞队列,可能是多个Task) 任务取消 取消一个任务,或一段程序,最容易想到的操作是增加判断标志,每次执行的时候判断,否则退出程序。但自定义的变量并不能解决阻塞问题。例如下面代码,如果在循环中阻塞了,那么它永远无法判断取消标志。 while(!cancelled) { do som

KDLin‘s Blog 2015

双RTX 3090实战:如何用vLLM低成本部署Qwen2.5-14B大模型(附避坑清单)

本文详细介绍了如何利用双RTX 3090显卡低成本部署Qwen2.5-14B大模型的完整指南,包括硬件选型、环境配置、vLLM优化及生产环境调优。重点解析了BF16混合精度在显存占用与推理质量上的平衡策略,并提供了实用的避坑清单和性能调优技巧,帮助开发者高效实现大模型部署。

pz890123456的博客 698

Java并发编程实战:取消和关闭

一、任务取消 1、设置cancelled标志 在程序中声明volatile类型的cancelled标志,当任务调用者设置cancelled为true时,任务在运行过程中通过不断检查是否被取消可以得知任务被取消的消息,从而不再执行任务。如下代码所示: class PrimeGenerator implements Runnable{ private final List primes = n

supersnow0622的专栏 731

从零到英雄:WSL2与Ubuntu22.04的终极性能调优指南

本文详细介绍了如何在Windows系统中通过WSL2与Ubuntu22.04进行性能调优,涵盖内核定制、GPU加速、网络优化等关键技巧,帮助开发者打造媲美原生Linux的高性能开发环境,特别适合AI训练和大数据处理等资源密集型任务。

weixin_29218509的博客 523

VS2017配置PCL1.9.1 for win10(超详细)

准备工作 VS2017 自行下载 PCL1.9.1 点击链接跳转Github下载,根据自己的环境选择 win64或win32,作者下载的是:PCL-1.9.1-AllInOne-msvc2017-win64.exepcl-1.9.1-pdb-msvc2017-win64.zip 安装PCL 双击点开PCL-1.9.1-AllInOne-msvc2017-win64.exe,选择Add PCL to the system PATH for all users, 更改安装路径,E:\Progra

malapoa的博客 1144

《java并发编程实战》 第七章 任务、线程的取消与关闭

《java并发编程实战笔记》第七章 任务、线程的取消与关闭任务如何取消通过判断volatile类型的状态量----不一定可靠通过中断-----实现取消最合理方法 第七章 任务、线程的取消与关闭 要使任务和线程安全、快速、可靠的停止下来,并不是一件容易的事情。java没有提供任何机制来安全地终止线程,但提供了中断协作机制,中断能使一个线程终止另一个线程的当前工作。 任务如何取消 任务取消的原因有很多...

乌鸦大大 1180

从零开始学 PyTorch 7天路线图(完整可运行代码版)

本文提供了5天PyTorch入门教程的完整代码,涵盖从基础到实战的核心内容。Day1测试环境并介绍张量基础;Day2讲解常用张量操作;Day3演示自动求导机制;Day4实现完整线性回归模型;Day5构建MNIST手写数字识别全连接网络。所有代码可直接运行,包含GPU检测、梯度计算、模型训练和可视化等关键环节,帮助新手快速掌握PyTorch核心概念和典型应用场景。

IT老农民的博客 314

并发编程6:任务或线程的取消与关闭

Java 提供了中断 (Interruption)协作机制,通过该机制能够使一个线程终止另一个线程的当前工作。这种协作式的方法是必要的,我们很少希望某个任务、线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态。相反,在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清除当前正在执行的工作,然后再结束。这提供了更好的灵活性,因为任务本身的代码比发出取消请求的代码更清楚如何执行清除工作。//中断操作应该由中断线程本身去决定何时中断。

swadian2008的博客 751

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java并发编程(六):任务取消、中断与关闭

这一节介绍并发编程中如何对任务执行取消操作。java中没有提供停止线程的方法,只用通过协作——使代码遵循一定的协议来请求取消。 轮询检查 一种常见的取消任务的办法是轮询检查。线程在执行的过程中通过定期检查一个boolean变量来决定是否终止任务。下面是一个使用轮询检查来终止素数生成的例子: public class PrimeGenerator implements Runnable { private static ExecutorService exec = Executors.newCache

Cobb141的博客 2119

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java并发编程-取消与关闭

2、使用线程的interrupt()方法,会给当前线程的boolean类型的中断状态设置为true。任务本身仍只是一个 Callable,但通过 Executor.newTaskFor 钩子,把自定义的资源级取消逻辑注入到了 Future.cancel() 中,从而在不改变使用方式的前提下,增强了取消语义。线程的所有权是不可以传递的,应用程序可以拥有服务,服务可以拥有工作者线程,但是应用程序不能拥有工作者线程,因此应用程序不能直接停止工作者线程。这时任务是执行了,但是线程池没有记录,还是未执行完的状态。

weixin_52917644的博客 749

java并发编程(六)取消与关闭

接《java并发编程(五)任务执行》 前面几章我们一直是创建和开启线程,而有时候我们要结束任务或线程,这并不是很容易的,因为,java 并没有提供任何机制来安全终止线程(在未来的jdk版本中会不会加入呢?)它提供了中断。这是一种机制,能够在一个线程终止另一个线程的工作。 任务取消 一种协作方式是设置某个“已请求取消”标识,而任务将定时查看该标志。下面程序,将持续枚举素数,直到它将被取消。ca

p_max的专栏 658

JAVA并发编程实战-取消和关闭

目录前言1 任务取消1.1 中断 前言 有时候我们希望任务或者线程自然结束前就停止它们,可能用户点击取消或者应用程序需要关闭。Java中提供了中断使一个线程可以要求另一个线程停止当前工作。 1 任务取消 可取消的活动:当外部代码能够在活动自然完成前,将其状态改为完成状态。 可能有多种原因导致活动关闭如: 用户请求的取消。用户点击取消按钮。 限时活动。设置超时器,如果超出停止活动。 应用程序事件,任务分解搜索,一个任务搜索到,停止其它任务。 错误。当多个任务保存页面,一个遇到磁盘满,其它取消。 关闭。当

qq_36566262的博客 1500

《Java并发编程实战》 任务执行和取消关闭

http://blog.youkuaiyun.com/androiddevelop/article/details/27299357   Java没有提供任何机制来安全地(抢占式方法)终止线程,虽然Thread.stop和suspend等方法提供了这样的机制,但是由于存在着一些严重的缺陷,因此应该避免使用。但它提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工

清文的博客 2524

Java 并发编程之任务取消(四)

采用newTaskFor来封装非标准的取消

TO TOP CODER 1185

Java并发编程实战 取消与关闭总结

任务取消 如果外部代码能在某个操作正常完成之前将其置入 完成 状态 那么这个操作就可以称为可取消的(Cancellable) 取消某个操作的原因很多: 用户请求取消 有时间限制的操作 应用程序事件 错误 关闭 在Java中没有一种安全的抢占式方法来停止线程 因此也就没有安全的抢占式方法来停止任务 只有一些协作式的机制 使请求取消的任务和代码都遵循一种协商好的协议 其中一种协作机制能设置某个 已...

勤劳的搬运工 469

Java并发编程学习12-任务取消和线程中断

《任务取消》由于篇幅较多,拆分了两篇来介绍各种实现取消和中断的机制,以及如何编写任务和服务,使它们能对取消请求做出响应。

Huazie 814

java多线程并发之旅-31-任务的关闭与取消

java 对于终止线程的考虑 Java没有提供任何机制来安全地(抢占式方法)终止线程, 虽然Thread.stop和suspend等方法提供了这样的机制,但是由于存在着一些严重的缺陷,因此应该避免使用。 但它提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。 一、取消 取消操作的原因 用户请求取消 有时间限制的操作 应用程序事件 错误...

1万+

并发编程之任务&线程的取消与关闭

任务或线程的取消与关闭 在向线程提交任务并且任务开始执行之后,通常任务执行完就自行停止和结束了,但是很多时候,我们希望在任务自行结束之前能提前终止,比如用户进行了取消操作等。具体来说,取消操作分为以下几种: 用户请求的取消操:比如用户按取消按钮,通过管理接口请求取消等; 超时停止:比如请求某个http请求,希望在指定时间还没返回结果时取消任务。 应用程序事件:比如寻找迷宫出口,如果有一...

iteye_9153的博客 289

java线程取消与关闭的多种方法

目录 1.任务取消       1.1通过volatile类型的域来保存取消状态 1.2通过 future 的cancel取消线程 1.3使用interrupt()方法中断当前线程  1.4使用shutdown()和shutdownNow()   1.4.1 shutdown()   1.4.2 shutdownNow() 1.5使用sto...

兔PP的博客 1843

Java并发编程实战之 取消与关闭、线程池的使用

第六章 取消与关闭 6.1 任务取消 协作机制能设置某个标志位,任务会定期查看这个标志,如果设置了标志,那么任务将提前结束。 如果外部代码能在某个操作正常完成之前将其置入“完成”状态,那么这个操作就可以称为可取消的。 如何取消一般有两种方法: 使用状态变量。线程中循环遍历状态变量,检测是否需要结束当前线程。 使用中断。系统提供的大多数阻塞方法会相应中断Thread.interrupt:清除中断状态Thread.isinterrupted;抛出InterruptedException异常;表示阻塞操作由于中

weixin_44593818的博客 739
上一篇: 算法系列(十三)图论基本概念和拓扑排序
下一篇: SQLite清空表并将自增列归零
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值