Java 现代Android中的非合作线程.stop()替代方案
Java 现代Android中的非合作线程.stop()替代方案,java,android,multithreading,Java,Android,Multithreading,Thread.stop()现在已从现代Android API中删除。从 应该将stop的许多用法替换为只修改某些变量以指示目标线程应该停止运行的代码。目标线程应定期检查此变量 我认为完全删除一个方法必须有它的替代品作为后盾,无论是对于可替换的多种用途,还是对于不可替换的许多其他用途。因此,我想知道Thread.stop()的替代方案是什么,它可以在协作中断标志不起作用的情况下停止线程,这可能是由于调用缓慢的第三方函数造成的 从我在谷歌上搜索的文章和我读到的关于这个问题的重复问题中,我只得到了两种
Thread.stop()
现在已从现代Android API中删除。从
应该将stop
的许多用法替换为只修改某些变量以指示目标线程应该停止运行的代码。目标线程应定期检查此变量
我认为完全删除一个方法必须有它的替代品作为后盾,无论是对于可替换的多种用途,还是对于不可替换的许多其他用途。因此,我想知道Thread.stop()
的替代方案是什么,它可以在协作中断标志不起作用的情况下停止线程,这可能是由于调用缓慢的第三方函数造成的
从我在谷歌上搜索的文章和我读到的关于这个问题的重复问题中,我只得到了两种不令人满意的答案:
你应该考虑合作中断,因为它不是愚蠢的。
Thread.stop()
现在不管什么原因都不见了,所以还是算了吧Thread.stop()
的功能替代方案,或者解释删除它的基本原理,尽管合法的用例取决于它,“合法”意味着不存在任何同步和锁定问题,我将不胜感激
提前感谢。没有“现代”选择。旧的选择仍然是唯一的选择。为什么?因为这是一个根本无法解决的问题1。。。如果线程不合作,或者当它们输入一个中断时能够正确地取消拾取
请注意,Thread.stop()
不安全的技术原因包括:
- 它通过停止线程来打破互斥锁。这可能会留下已锁定的对象。。。或其他物体。。。处于不一致的状态
- 这可能会导致线程间信号中断。例如,如果一个线程需要通知一个条件变量,并且在这之前它被停止了,那么其他线程可能会永远等待一个永远不会到达的通知
线程死亡
并采取补救措施,逐个解决上述问题。但借用别人的话来说,“这将是疯狂的混乱”
如果你认为这一切都不令人满意,我很抱歉。但这就是生活。如果您不能将线程编写为协作线程,并且需要它们是可终止的,请通过
process
等在外部进程中运行它们
现在。。。如果我们可以挥动魔杖,用类似CSP的并发模型取代Java线程(并避免进程之间的状态共享),那么问题就不会出现了。不过,现在您必须处理另一个问题,即当进程终止时,如何处理排队的消息。但至少这是一个容易处理的问题
1-我在没有证据的情况下断言这一点!然而,如果这是一个可解决的问题,那么你会认为Sun、Oracle或Google会在上个世纪发现并实施一个解决方案。。。嗯。。。25年挑战:如果你能想出一个可行的安全杀死Java线程的实现模型,我希望某些公司会愿意为你提供一份报酬很高的工作。尤其是如果他们可以保护您的专利的专有权。
stop()
已经被弃用了近20年,至少回到了。@commonware确实如此,但我不会问它是否只是被弃用而不是完全删除。几年前,Oracle从Java中删除了它。顺便说一句,开发人员在使用低级线程时使用的是interrupt()
。这也是Oracle推荐的备选方案之一。也许您可以在[java]标记中提出您的问题。你也可以考虑发布一个你认为不可能解决的问题,用<代码>中断()/<代码>,并要求<代码> StUTE()/<代码>。我可以看到一些这样的场景,主要涉及通过JNI调用有缺陷的C/C++代码。但是,最后,建议可能是特定于场景的,而不是一些通用的stop()
替换。毕竟,如果一个通用的stop()
替换是可行的,你可以想象Sun或Oracle会实现它。因此,[java]标记中的一个问题,如果与您的具体问题有关,则更有可能为您提供帮助。@Commonware感谢您的指点,我已经添加了java标记。你是对的,我使用的第三方库确实包含本机代码,这是“有缺陷的”,因为它没有为协作中断公开接口。一个类似的问题和例子也被问到了,结果只得到了令人失望的答案。我避免给出这样的具体例子,因为与具体的“无缺陷”替代库的实际有用的建议相比,我更喜欢围绕有缺陷但常见的库的连贯的故事。谢谢你的建议<代码>进程确实是最后的选择,但在此之前,我宁愿使用pthread\u kill
创建自己的JNI。由于它与Thread.stop()
的行为非常相似,因此我更困惑的是stop
一开始就被删除了。使用pthread\u kill
将比Thread.stop
更不安全。删除stop
的原因有很好的文档记录。文档确实很好地解释了Thread.stop
并不完美,但我不认为它可以证明删除它是合理的。有点夸张,它说的是“因为用负数索引数组会导致溢出,所以让我们完全放弃有符号整数类型,而在绝对紧急的情况下使用成对的无符号整数”,这是疯狂的。耸耸肩。。。你有权