可靠地停止无响应的线程

2023-12-23

我想知道如何停止 Java 中无响应的线程,使其真正死亡。

首先,我很清楚Thread.stop()已被弃用以及为什么不应使用它;关于这个主题已经有很多出色的答案,参见。[1] https://stackoverflow.com/questions/10645216/killing-an-unresponsive-thread-in-android-java[2] https://stackoverflow.com/questions/10961714/how-to-properly-stop-the-thread-in-java。因此,更准确的问题是,从技术上来说,是否真的有可能杀死一个代码不受我们控制但可能具有敌意且不响应中断的线程。

在最简单的情况下,一个敌对线程正在运行while(true);,但它也可能会耗尽内存或其他系统资源来造成更大的损害。呼唤interrupt()在该线程上显然是无效的。打电话怎么办stop()反而?

我已经在调试器中运行了它,事实上,线程真的消失了。但这种方法可靠吗?敌对线程可以为这种情况做好准备;考虑到try{run();}catch(ThreadDeath t){run();}它捕获的地方ThreadDeath当我们调用时产生的stop()并再次递归调用自身。

作为一个局外人,我们看不到正在发生的事情;Thread.stop()总是默默地运行。最糟糕的是,通常的诊断将不再起作用(在 Corretto 1.8.0_275 Windows x64 上调试时尝试过此操作):Thread.getState()总是返回RUNNABLE无论是否成功杀死线程,同样适用Thread.isAlive()(始终正确)。


这可能是不可能的,至少在每种情况下都不可靠。

如果我正确理解了该机制(并且存在一些不确定性),如果代码以在执行期间没有安全点的方式执行(例如在计数循环中),则 JVM 不可能向它应该停止的线程(该线程从不轮询中断)。

在这种情况下,您需要杀死 JVM 进程,而不是线程。

一些额外阅读:

当 JVM 无法到达安全点时如何获取 Java 堆栈 https://stackoverflow.com/questions/20134769/how-to-get-java-stacks-when-jvm-cant-reach-a-safepoint

计数循环 http://psy-lob-saw.blogspot.com/2016/02/wait-for-it-counteduncounted-loops.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可靠地停止无响应的线程 的相关文章

随机推荐

  • 访问对象数组中的 object.variable

    我需要这段代码的帮助 public class ParkingLot static int MAX 5 static Car Slot new Car MAX public static void main String args Slot
  • Postgresql COPY CSV 错误:最后一个预期列后有额外数据

    我正在尝试从以下位置导入数据http www unitedstateszipcodes org zip code database http www unitedstateszipcodes org zip code database 数据
  • Android NDK 生成不合理的大二进制文件,如何优化 .so 大小?

    我注意到 Android NDK r6b在我的例子中 产生不合理的大结果 so 文件 例如 在我的例子中 我有大约 150 200 行 C 代码 6 个本机方法和 3 个 C 最简单的类 并且此本机代码生成60kb 具有启用的异常和 RTT
  • 调试时“myapp.exe 已触发断点” - 随后 Visual Studio 2015 Update 3 中的符号加载速度缓慢

    我们有一个 STA 模式的 C 项目 它打开一个托管 ESRI ArcEngine 的 C WPF 库MapControl通过 WindowsFormsIntegration 这在 Visual Studio 2013 中工作得很好 自从我
  • 如何使@CreatedBy和@CreatedDate在Spring数据jdbc中不可修改?

    我在 spring data jdbc 中使用简单的 CRUD 操作和审计 因此 当我插入新记录时 审计工作绝对正常 但是当我更新我的记录时 我的创建者和创建日期设置为空 有什么方法可以避免修改这些列吗 注意 spring data jdb
  • Winform 图表控件未创建正确的折线图

    我在使用 Winform 图表控件创建折线图时遇到错误 我用的是VS2013 I m plotting a line chart and it produces the strange visual effect of a single s
  • Facebook OAuth 不返回用户信息中的电子邮件

    我正在进行 spree 3 0 安装 ROR 并尝试使用 facebook oauth 进行身份验证 但成功 oauth 后发回的字段不包含电子邮件 这对我们的应用程序至关重要 这是 facebook 认证成功后的返回结果
  • 如何将 wiris 添加到 django-ckeditor

    我想在我的基于 Django 的项目中使用 CKEditor WIRIS 插件 我成功安装了 django ckeditor 但我不知道应该使用哪个WIRIS插件 在下载页面 http www wiris com en plugins3 c
  • Python/Scipy 插值(地图坐标)

    我正在尝试用 scipy 进行一些插值 我已经浏览了很多例子 但我没有找到我想要的 假设我有一些数据 其中行和列变量可以从 0 变化到 1 每行和列之间的增量变化并不总是相同 见下文 0 00 0 25 0 80 1 00 0 00 1 4
  • 将工作表中的图片获取到 Excel 用户窗体中

    我希望在用户窗体上的图像控件中查看工作表中的图像 该图像将根据组合框中的值而变化 我已将一些图像插入 使用 插入 gt 图片 到工作簿的 Sheet1 中 并将它们命名为 Picture1 和 Picture2 我创建了以下用户表单 表格h
  • 角度和样式表之间的两种绑定的解决方案

    我知道这听起来很愚蠢 但我正在编写一个所见即所得编辑器 允许设计师创建样式指南 我对 Angular 中的双向绑定非常着迷 并且很好奇是否可以在 css 工作表和 css 表单之间进行双向绑定ng model输入字段 目前 我正在制作一个动
  • 在 MySQL 中设置名称 utf8?

    我经常在使用 MySQL 的 PHP 脚本中看到类似下面的内容 query SET NAMES utf8 我从来没有为任何项目这样做过 所以我有几个基本问 题 这是只用 PDO 完成的事情吗 如果不是PDO特有的事情 那么这样做的目的是什么
  • 为什么通过 DerefMut 闭包的可变借用不起作用?

    我正在尝试可变地借用可变变量 Deref and DerefMut实施用于Foo 但编译失败 use std ops Deref DerefMut struct Foo impl Deref for Foo type Target FnMu
  • Django Rest模型权限

    我正在使用 Django 2 1 和 djangorestframework 3 9 2 我希望能够通过 Django 管理界面控制对 Django 模型对象的 REST 操作的访问 最好使用用户权限 例如 只有对模型对象 Foo 具有读取
  • java.security AES 加密密钥长度

    当密钥长度为 128 位时 一切正常 但是当我使用长度为 192 或 256 位的密钥时 出现以下异常 java security InvalidKeyException Illegal key size or default parame
  • 在 S3 上存储系统生成的 PDF

    已解决 请参阅底部编辑 在我的 3 1 Rails 应用程序中 我生成如下 pdf def show contributor Contributor find params id respond to do format format pd
  • 在 JVM 上运行最快的语言是什么 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 JVM 上运行速度最快的语言是什么 斯卡拉 时髦 JRuby See 计算机语言基准游戏 https benchmarksgame team
  • 我可以使用 s3cmd mv 命令将对象移动到 S3 存储桶内的“文件夹”中吗?

    我有s3cmd安装了Linux 的命令行工具 将文件放入存储桶中效果很好 但是 我想将文件移动到 文件夹 中 我知道 S3 本身不支持文件夹 但我的 Cyber duck GUI 工具可以很好地转换它们 以便我查看备份 例如 我在存储桶的根
  • NHibernate 左外连接不相关实体

    我有 2 个实体角色和翻译 角色 gt Role ID 代码翻译 gt 代码 语言 名称 这个想法是说对于某个角色 它有英文名 法文名等等 例如 Role 1 Rol 001 可以具有以下关系 Translation Rol 001 Eng
  • 可靠地停止无响应的线程

    我想知道如何停止 Java 中无响应的线程 使其真正死亡 首先 我很清楚Thread stop 已被弃用以及为什么不应使用它 关于这个主题已经有很多出色的答案 参见 1 https stackoverflow com questions 1