Thread.stop()
现已从现代 Android API 中删除。从https://developer.android.com/reference/java/lang/Thread#stop(),
用途广泛 of stop
应替换为仅修改某些变量以指示目标线程应停止运行的代码。目标线程应该定期检查这个变量,...
我认为完全删除一种方法必须得到它的替代方法的支持,无论是为了多种用途它可用于可替换的地方,以及不可替换的许多其他用途。因此我想知道什么是替代方案Thread.stop()
停止协作中断标志不起作用的线程,这可能是由于例如缓慢的第三方函数的调用。
从我用谷歌搜索的文章和我读过的关于这个问题的重复的SO问题中,我只得到了两种不满意的答案:
- 你应该考虑合作中断,因为它并不愚蠢。
-
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(使用前将#替换为@)