首页 > 解决方案 > 现代 Android 中的非合作 Thread.stop() 替代方案

问题描述

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

的许多用法stop应该由简单地修改一些变量以指示目标线程应该停止运行的代码替换。目标线程应该定期检查这个变量,...

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

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

  1. 您应该只考虑合作中断,因为它并不愚蠢。
  2. Thread.stop()现在不管什么原因都消失了,所以忘记它吧。

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

提前致谢。

标签: javaandroidmultithreading

解决方案


没有“现代”的选择。旧的替代品仍然是唯一的选择。为什么?因为这从根本上是一个无法解决的问题1 ...如果线程不合作,或者当它们发出中断时能够正确地取消选择事物。

作为记录,Thread.stop()不安全的技术原因包括

  • 它通过停止线程来打破互斥锁。这可能会使被锁定的对象……或其他对象……处于不一致的状态。
  • 它可能会导致线程间信号中断。例如,如果一个线程被期望通知一个条件变量,并且它在这发生之前就停止了,那么其他线程可能会永远卡住,等待一个永远不会到达的通知。

如果已经说过,理论上可以通过应用程序代码通过捕获ThreadDeath并采取补救措施来解决上述问题。但借用别人的话说,“这将是疯狂的混乱”。


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

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


1 - 我在没有证据的情况下断言这一点!但是,如果这是一个可解决的问题,那么您会认为 Sun 或 Oracle 或 Google 会在过去……嗯……25 年中发现并实施解决方案。 挑战:如果你能想出一个可行的实现模型来安全地杀死 Java 线程,我希望某些公司愿意为你提供一份高薪的工作。特别是如果他们可以确保您的专利的专有权。


推荐阅读