现代 Android 中的非合作 Thread.stop() 替代方案

2023-12-06

Thread.stop()现已从现代 Android API 中删除。从https://developer.android.com/reference/java/lang/Thread#stop(),

用途广泛 of stop应替换为仅修改某些变量以指示目标线程应停止运行的代码。目标线程应该定期检查这个变量,...

我认为完全删除一种方法必须得到它的替代方法的支持,无论是为了多种用途它可用于可替换的地方,以及不可替换的许多其他用途。因此我想知道什么是替代方案Thread.stop()停止协作中断标志不起作用的线程,这可能是由于例如缓慢的第三方函数的调用。

从我用谷歌搜索的文章和我读过的关于这个问题的重复的SO问题中,我只得到了两种不满意的答案:

  1. 你应该考虑合作中断,因为它并不愚蠢。
  2. Thread.stop()现在由于某种原因已经消失了,所以就忘记它吧。

如果您能提供一个有效的替代方案,我将不胜感激Thread.stop()或解释删除它背后的基本原理,尽管合法用例依赖于它,其中“合法”意味着不存在任何同步和锁定问题。

提前致谢。


There is no "modern" alternative. The old alternatives are still the only ones. Why? Because this is fundamentally an unsolvable problem1 ... if the threads are not cooperating / checking for thread interrupts, or if they unable to correctly deal with a thread interrupt.

根据记录,技术原因Thread.stop()不安全include:

  • 它通过停止线程来破坏互斥锁。这可能会使被锁定的对象...或其他对象...处于不一致的状态。
  • 它可能会导致线程间信号中断。例如,如果一个线程需要通知一个条件变量,但它在此之前被停止,那么其他线程可能会永远卡住,等待永远不会到达的通知。

如果这么说的话,诸如上述的问题就可以理论上由应用程序代码根据具体情况进行处理。例如,如果您正在使用stop()你可以抓住ThreadDeath在所有必要的地方,采取补救措施,然后重新抛出。但借用别人的话说,“这会非常混乱”。


如果您认为这一切都不满意,我很抱歉。但这就是生活。如果你不能编写你的线程来进行协作,并且你need它们是可杀死的,在外部进程中运行它们,通过Process等等。

现在...如果我们可以挥舞魔杖,用类似 CSP 的并发模型替换 Java 线程(并且这样做可以避免进程之间的状态共享),那么问题就会消失。不过现在您必须处理另一个问题,即当进程终止时如何处理排队的消息。但至少这是一个可以处理的问题。


1 - I am asserting this without proof! However, if it was a solvable problem, then you would have thought that Sun or Oracle or Google or someone smart academic would have discovered and implemented a solution in the last ... umm ... 25 years. Challenge: If you can come up with a viable implementation model for safely killing Java threads, I expect that certain companies would be willing to offer you a very well-paid job. Especially if they can secure exclusive rights on your patent!!

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

现代 Android 中的非合作 Thread.stop() 替代方案 的相关文章

随机推荐

  • 从 Access 2007 传输到 Excel 2007 时排除列标题的代码

    这是我正在使用的代码 它工作正常 但我需要知道需要哪些附加代码来排除列标题 Private Sub Command104ContrDonatWeekly Click On Error GoTo Command104ContrDonatWee
  • UnitOfWork 等于 Transaction 吗?或者还不止于此?

    互联网上充满了有关UnitOfWork图案 即使如此也不例外 我还是不明白 以我的理解UnitOfWork Transaction in DB 就这样 仅此而已 它是否正确 我的困惑是由于它是如何在不同的环境中实现的ORMs NHibern
  • 正则表达式,按大写字母分割字符串但忽略 TLA

    我正在使用正则表达式 System Text RegularExpressions Regex Replace stringToSplit A Z 1 Trim 按大写字母分割字符串 例如 我的名字是西蒙 变成 我的名字是西蒙 我发现这在处
  • 自动为 Woocommerce 上购买的产品设置特定属性术语值

    我想在下订单并处于 暂停 状态时自动向订购的产品添加特定的属性值 之前设置 我销售独特的产品 并且我设置了 STOCK 属性和 Out Of Stock 缺货 值 当下订单并处于 暂停 状态时 我想自动更改订购产品的特色状态 并向其添加缺货
  • WCF 捕获异常“服务器未提供有意义的回复..”

    服务器调用后 我的客户端捕获异常并显示以下消息 服务器没有提供有意义的回复 这可能是由合同不匹配 会话过早关闭或内部服务器错误引起的 另外 请注意我尝试了配置WCF 服务器没有提供有意义的回复 但还是没用 请注意 我将服务调试到最后 并且数
  • Spring Boot 2:动态刷新属性不起作用

    我已经按照这个官方教程进行操作了入门集中配置使用 Spring Boot 2 0 0 RELEASE 和 Spring Cloud Finchley M8 但动态刷新属性 无需重新启动 不起作用 经过一些调试 我注意到在ContextRef
  • 使用 Backbone.js 的投票系统

    我有一个Book具有属性的模型upVotes Book可以从数据库 MongoDB 查询 修改实例 然后保存 如果用户对一本书进行投票 我会更新upVotes计数 并将整个模型保存回服务器 问题是 如果其他人在实例加载时间和保存实例时间之间
  • spring:escapeBody 导致无效的 JSON

    我试图转义 JSP 中的字符串以在 AJAX 调用上返回有效的 JSON 但是 spring escapeBody 标记未正确转义 JSON 的单引号 有效的 JSON 不应转义单引号 status success body
  • Spring数据中的@Transient不起作用

    I have Settlement entity Entity Table name settlement public class Settlement ManyToOne JoinColumn name subscription x p
  • 使用 Elmah 记录 WCF Web 服务的用户名

    我们正在使用描述的方法here使用 Elmah 记录我们的 Web 服务错误 这确实有效 但遗憾的是记录的用户名是空的 我们做了一些调试 发现在 ErrorHandler 中记录错误时HttpContext Current User具有正确
  • Windows Phone ApplicationBar BackgroundColor 属性样式 XamlParseException

    我的应用程序中有很多页面 我决定在 App Resources 中创建一个全局 ApplicationBar 样式 然而 当我尝试启动应用程序时 VS 给了我一个错误 The property BackgroundColor was not
  • 在 PHP 安装上启用 Mcrypt

    我使用 Apache 2 2 16 在 Windows 机器上安装了 PHP 5 2 14 通过 msi 安装 安装附带了 ext php mcrypt dll 和 libmcrypt dll 但当我取消注释时扩展名 php mcrypt
  • Sql PIVOT 和字符串连接聚合

    我想使用数据透视 SQL 查询来构造一个结果表 其中连接文本作为数据透视表的数据部分中的结果 即我使用简单的选择得到以下结果 Event Name Resource Type Resource Name Event 1 Resource T
  • web.xml 中使用 CharacterEncodingFilter 进行 Spring 编码

    stackoverflow com 上的编码 我的网站上的编码
  • 将 JXTable 与 RXTable 组合

    Problem 我想要的能力JXTable与 编辑时全选 行为RXTable 进行简单的覆盖就可以了 但是 RXTable 的双击功能不适用于 JXTable 当使用 按钮操作 模式时 这很好 但是当使用 F2 或双击 JXTable 中的
  • 为什么函数的地址会随着每次运行而改变?

    我正在努力将地址映射到其符号以进行调试 获取调用堆栈 MS dbghelp dll 可以从地址中识别符号 请参阅SymFromAddr MSDN 然而 它不起作用 我想知道这是如何工作的 因为地址似乎随着程序的每次运行而改变 include
  • 如何解释 CPU 窗口反汇编窗格中的列?

    There is a tool called the CPU window which I get pressing Ctrl Alt C that shows the disassembly of my code 内存地址左边的绿色箭头表
  • 突出显示和过滤 (gcc) 编译器消息

    我目前正在重构一个 C 项目 向我抛出大约 1000 个警告 有没有办法突出显示和过滤这些警告 例如 将所有索引警告设置为红色 未使用的警告设置为蓝色 以及其他一些警告 很可能有些IDE可以做到这一点 但这对我来说不是解决方案 This i
  • 找不到模块“minizlib”

    我对 React Native 还很陌生 我使用下面的代码在我的 Mac 上安装 React Native npm install react native g react native cli 我收到错误 npm ERR code MOD
  • 现代 Android 中的非合作 Thread.stop() 替代方案

    Thread stop 现已从现代 Android API 中删除 从https developer android com reference java lang Thread stop 用途广泛 of stop应替换为仅修改某些变量以指