[java] 停止线程

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示 本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。 阅读详情

在java中有几种方法可以终止正在运行的线程

  1. 使用退出标志,使线程正常退出,
  2. 使用interrupt方法中断线程
  3. 使用stop方法强行终止线程->已作废。
  4. 异常法停止线程。推荐。在代码适当的位置抛出InterruptedException。我们知道在java当中遇到线程时当前线程会停止。
  5. 使用return与interupt()结合也能停止线程。不如异常法。

这里着重介绍第二种方法,使用interrupt。

interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程就得以退出阻塞的状态。 更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

线 程A在执行sleep,wait,join时,线程B调用线程A的interrupt方法,的确这一个时候A会有 InterruptedException 异常抛出来。但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。 如果线程A正在执行一些指定的操作时如值,for,while,if,调用方法等,不会去检查中断状态,则线程A不会抛出 InterruptedException,而会一直执行着自己的操作。

注意:

当线程A执行到wait(),sleep(),join()时,抛出InterruptedException后,中断状态已经被系统复位了,线程A调用Thread.interrupted()返回的是false。

如果线程被调用了interrupt(),此时该线程并不在wait(),sleep(),join()时,下次执行wait(),sleep(),join()时,一样会抛出InterruptedException,当然抛出后该线程的中断状态也会被系统复位。

(总结一下:调用interrupt()方法,立刻改变的是中断状态,但如果不是在阻塞态,就不会抛出异常;如果在进入阻塞态后,中断状态为已中断,就会立刻抛出异常)

1. sleep() &interrupt()

线程A正在使用sleep()暂停着: Thread.sleep(100000),如果要取消它的等待状态,可以在正在执行的线程里(比如这里是B)调用a.interrupt()[a是线程A对应到的Thread实例],令线程A放弃睡眠操作。即,在线程B中执行a.interrupt(),处于阻塞中的线程a将放弃睡眠操作。

当在sleep中时线程被调用interrupt()时,就马上会放弃暂停的状态并抛出InterruptedException。抛出异常的,是A线程。

2. wait() &interrupt()

线程A调用了wait()进入了等待状态,也可以用interrupt()取消。不过这时候要注意锁定的问题。线程在进入等待区,会把锁定解除,当对等待中的线程调用interrupt()时,会先重新获取锁定,再抛出异常。在获取锁定之前,是无法抛出异常的。

3. join() &interrupt()

当线程以join()等待其他线程结束时,当它被调用interrupt(),它与sleep()时一样,会马上跳到catch块里。

 

注意,调用的interrupt()方法,一定是调用被阻塞线程的interrupt方法。如在线程a中调用线程t.interrupt()。

使用interrupt方法并不像for循环里的break语句那样,马上就停止循环。调用interrupt()方法仅仅是在当前线程中打一个停止的标记,并不是真正的停止线程。这个方法不会终止一个正在运行的线程,还需要加入一个判断才完成线程的停止。

java里 interrupt()方法只是设置线程的中断标记,当对处于阻塞状态的线程调用interrupt方法时(处于阻塞状态的线程是调用sleep, wait, join 的线程),会抛出InterruptException异常,并退出阻塞队列,也即是停止。而这个异常会清除中断标记.

在此之前先看以下如何判断线程的状态是不是停止的。在Thread.java里面提供了两种方法。

  1. this.interrupted():测试当前线程是否已经中断。当前线程是指运行this.interrupted方法的线程。执行后具有将状态标志清除为false的功能。即连续两次调用,无论如何第二次一定返回false。
  2. this.isInterrupted():测试线程Thread对象是否已经是中断状态。但不清除状态标志。即它可能会连续返回两个true。

若一个线程正处于sleep状态下,然后被interupt,则会抛出InterruptedException,进入catch语句,并且清除停止状态的值,使之变成false

总结起来:interrupt()常常被用来终止“阻塞状态”线程,而对于正在运行的线程,它只会将它的标志位改为true,然后程序员可以通过这个标记位自己进行判断来在恰当的时候终止线程。

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载) 本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。 阅读详情

相关推荐

Mission Planner连接Autopilot保姆级教程:从USB到无线全搞定

本文提供Mission Planner连接Autopilot的全面指南,涵盖USB直连、无线数传、蓝牙适配等多种连接方案。详细讲解驱动安装、波特率匹配、性能优化等关键步骤,并分享多链路冗余配置与故障转移的高阶技巧,助你快速解决连接问题。

weixin_28455801的博客 377

Java 终止线程的几种方式

一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。他们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。我们可以直接使用thread.stop()来强行终止线程,但是stop()方法是很危险的,就想突然关闭电源一样。所谓正常运行结束,就是程序正常运行结束,线程自动结束。

书香水墨 9480

IAR安装成功的关键:STM32设备支持文件导入方法

IAR安装常卡在设备支持缺失这一步——尤其对STM32新手,没导入对应芯片包,编译直接报错。实测发现,必须通过IAR的Tools→Options→IDE→Configuration→Device Support手动加载STM32设备支持文件,否则新建工程时连芯片型号都选不到。IAR安装是否顺利,往往就差这一步。

weixin_42527589的博客 680

Java中停止线程的3种方式

在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程。 使用线程中断方法 interrupt 停止线程。 使用 stop 停止线程。 其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给线程足够的时间来处理停止前的保存工作,就会造成数据不完整的问题,因此不建议使用。而自定义中断标识也有一些问题,所以综合来看,interrupt 方法才是最理想的停止线程的方法,接下来我们一起来看它们的具体差异。

开源世界 1万+

IIS - 会话cookie中缺少HttpOnly属性

不啰嗦,我们直接开始! 先进行常规设置 打开配置编辑器 选中图中节点,将httpOnlyCookies设置为true 然后。。。不起作用。。。 换种方式 通过配置出站规则getcookie添加HttpOnly 在Web.config中添加如下出站规则 <rewrite> <outboundRules> <rule name="Add HttpOnly"> <match serverVa.

。 21万+

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4409

【Java多线程】停止线程

大多数停止一个线程的操作使用Thread.interrupt()方法,尽管方法的名称是“停止,中止”的意思,但这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的(unsafe),而且是已被弃用作废的(deprecated), 在将来的Java版本中,这个方法将不可用或不被支持。不过还是建议使用"抛异常"的方法来实现线程的停止,因为在catch块中还可以将异常向上抛,使线程停止的事件得以传播。测试这个线程是否被中断。

embelfe_segge的博客 2599

Proteus下载安装快速入门:30分钟掌握全过程

手把手教你完成proteus下载安装,从环境配置到首次运行一气呵成,适合电子设计新手快速掌握仿真工具的核心操作步骤。

weixin_31974443的博客 891

java 终止线程的4种方式

在线程的执行代码中,使用一个布尔类型的标志位来标识线程是否需要终止。线程在执行过程中,不断地检查这个标志位,如果标志位为true,则主动退出线程执行的循环或方法,从而终止线程的执行。

文无第一,武无第二 3802

深度篇——图像处理的一些方法(一) 关于 图像处理的三个层次 与 selective search

返回主目录 返回 图像处理的一些方法 目录 下一章:深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 目录内容 深度篇——图像处理的一些方法(一)关于图像处理的三个层次 与 selective search 深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 深度篇——图像处理的一些方法(三)细说 HOG特征与bag-o...

天下所弃,不过其纪。世间事,在人,在志。 2917

Origin教程004:Origin图形导出

需要编辑的话,双击图形,会自动用origin软件打开图形,这种方式是最开始导出图形的功能,方式一和二都是后面增加的。如果导出的图片边距较大的时候,会影响图片的美观,可以通过。也可以设置在PPT中直接编辑,找到。解决方法是,选择一条线,

WwLK123的博客 6332

Java终止线程的三种方式

参考文章:Java终止线程的三种方式 停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。 在 Java 中有以下 3 种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。 使用 stop() 方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用。 使用 interrupt 方法中断线程。 1. 使用标志位终止线程 在 run() 方法执行完毕后,该线程就终止了。但是在某些特殊的情况下,run() 方法

justlpf的专栏 3813

第5.2章 【自动驾驶行业融合定位核心】:手把手详解ESKF(误差卡尔曼滤波)理论公式及代码

自动驾驶定位中的ESKF(误差卡尔曼滤波)技术是解决IMU累积误差的关键,通过分离名义状态与误差状态实现高精度定位。其核心步骤包括:1)名义状态递推(位置/速度/姿态的基础物理计算);2)误差传播建模(雅可比矩阵F量化误差影响);3)协方差更新(评估定位不确定性)。ESKF在GNSS信号丢失(如隧道场景)、无卫星定位(地下车库)等场景发挥重要作用,通过融合多传感器数据维持定位精度。工程实现需解决零偏校准、协方差投影等关键问题,噪声参数需通过数据标定而非随意设置。掌握ESKF原理与实现是自动驾驶定位工程师的核

行知SLAM 704

java线程池停止线程_如何在Java中停止线程?

java线程池停止线程 停止线程 (Stopping a thread) As we know that there are no direct or shortcut ways to stop thread in Java. 众所周知,在Java中没有直接或快捷的方式来停止线程。 As we know thread in java stops when the execution of run...

cumtb2009的博客 5814

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

Java中如何停止线程

在Java中,直接停止线程并不是一件简单的事情,因为强制停止可能会导致资源泄露、数据不一致或死锁等问题。但是,我们可以通过两种优雅的方式来实现线程的停止。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6796

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java中停止线程

优雅地停止线程是编写高质量Java多线程程序的关键之一。在选择停止线程的方法时,需要考虑线程的执行情况、任务特性以及程序设计的要求。一般而言,使用interrupt()方法或者ExecutorService来管理线程是较为推荐的做法,可以有效地避免线程不安全的终止以及资源泄露等问题。

hello.reader 2234

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java中如何安全地停止线程?

Java中如何安全地停止线程?

java1234的博客 1433

Java中如何停止一个正在运行的线程

来判断thread对象所代表的线程是否停止,但从控制台打印的结果来看,线程并未停止,这也证明了interrupted()方法的解释,测试当前线程是否已经中断。我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程。由于stop()方法以及在JDK中被标明为“过期/作废”的方法,显然它在功能上具有缺陷,所以不建议在程序张使用stop()方法。上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。

maruofan666的博客 3215

Java中如何安全地停止线程

Java中线程停止应采用协作式而非强制方式。主要方法包括:**************

m0_66884848的博客 548

java中如何停止一个正在运行的线程

中断是一种线程间的通信机制,允许一个线程向另一个线程发送信号,表示“你应该停止当前工作”。被中断的线程可以决定如何响应中断请求,通常是退出运行。Java中的线程停止是通过协作的方式实现的,而不是强制中断。中断机制:通过请求线程停止,并让线程定期检查中断状态。此方法是Java推荐的线程停止方式,尤其是在涉及阻塞操作时。标志位:通过共享的布尔标志位控制线程的运行。这种方法适用于不涉及阻塞操作的场景。这两种方法都能确保线程安全地退出,而不会引发资源泄漏或数据不一致问题。理。

Flying_Fish_roe的博客 801

java 线程强制停止线程_java多线程之停止线程

在多线程开发中停止线程是非常重要的技术点。停止线程在Java语言中并不像break语句那样干脆。须要一些技巧性的处理。一、 异常法採用异常法来停止一个线程。首先我们须要了解一下两个方法的使用方法:1、interrupt()方法public class MyThread extends Thread{@Overridepublic void run() {for (int i = 1; i &lt...

weixin_30884455的博客 442

java 停止阻塞的线程_Java中停止线程执行的方法

Java中停止线程执行的方法一、暂停或停止线程的理论在Java编程中,要暂停或停止当前正在运行的线程,有几种方法。对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式。或许有人会问,为什么不使用等待wait()或通知notify()?要知道,使用等待或通知都不是很好的方式。线程可以使用等待wait()实现被阻塞,这属于条件等待的方式,当条件满足后,又会从阻塞转为等待状态...

weixin_39772849的博客 504

Java让线程停止的方法

线程停止大家所熟知的有三种:stop、volatile、interrupt stop:建议不要用,当线程正在进行一些耗时操作如读写,突然终止很可能会有错误发生 interrupt:建议不要用,当线程进入阻塞如 Thread.sleep(5000);调用interrupt会抛出异常,而且线程不会停止 volatile:建议使用,线程会执行完当前操作后停止。

sinat_27681957的博客 1万+

java线程池如何停止

Java线程池如何停止 在Java中,线程池是一种用于管理线程的机制,它可以有效地控制并发线程的数量,提高程序的执行效率。然而,有时候我们需要在程序运行过程中停止线程池,以释放资源或者避免不必要的线程竞争。本文将介绍如何优雅地停止Java线程池,并提供相应的代码示例。 线程池停止的必要性 在某些情况下,我们可能需要停止线程...

weixin_40851081的博客 203

java多线程-线程的停止【interrupt】

使用interrupt来通知,而不是强制java提供了interrrupt让一个线程来通知另一个线程停止如果想中断一个线程,但是那个线程不想去中断,那就无能为力,我们没有强制去中断线程的手段,因为线程停止前需要做一定的收尾工作所以正确停止线程,是如何用interrupt来通知那个线程,以及被停止的线程如何进行配合。

jx的博客 1553

java如何停止线程_Java如何停止线程?

在Java编程中,如何停止线程?以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程。package com.yiibai;import java.util.Timer;import java.util.TimerTask;class CanStop extends Thread {private volatile boolean stop = false;priva...

weixin_39640687的博客 182
上一篇: 事务重要知识及实现原理
下一篇: [java] ConcurrentHashMap
topEngineerr
博客等级 码龄11年 627粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值