引自"Effective Java book"
:
" 库提供了 Thread.stop 方法,但这种方法很久以前就被弃用了,因为它本质上是不安全的——它的使用会导致数据损坏。不要使用 Thread.stop "
谁能告诉我为什么?
引自"Effective Java book"
:
" 库提供了 Thread.stop 方法,但这种方法很久以前就被弃用了,因为它本质上是不安全的——它的使用会导致数据损坏。不要使用 Thread.stop "
谁能告诉我为什么?
如果您停止的线程持有关键锁怎么办?如果线程将对象置于不一致的状态并且还没有机会恢复它怎么办?停止线程的正确方法是与其合作,而不是从外部强迫它停止。
此外,它根本没有逻辑意义。应用程序中的所有线程都应该协作以实现相同的目的。如果有不应该做的事情,没有线程应该做。应该没有理由停止一个线程——它应该只被编码来做一些事情,如果这是整个应用程序首先需要做的事情。如果一个线程需要停止,那只是因为它正在运行的代码被破坏了——即使不应该做的事情也会做。只需修复该代码。
从javadoc:
为什么不推荐使用 Thread.stop?
因为它本质上是不安全的。停止线程会导致它解锁所有已锁定的监视器。(当 ThreadDeath 异常向上传播堆栈时,监视器被解锁。)如果以前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可能会查看这些处于不一致状态的对象。据说这些物体已损坏。当线程对损坏的对象进行操作时,可能会导致任意行为。这种行为可能很微妙且难以检测,也可能很明显。与其他未经检查的异常不同,ThreadDeath 以静默方式杀死线程;因此,用户没有警告他的程序可能已损坏。损坏可以在实际损坏发生后的任何时间出现,甚至在未来几小时或几天内。
有关更多信息,请阅读以下内容:
http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
恕我直言,只有使用它来停止另一个线程才是不安全的。您可以使用它来停止当前线程而不会出现正常问题,例如,如果您需要重新抛出已检查的异常。
stop() 的问题是你不知道你在线程中的哪个位置抛出异常或错误。您考虑使用它的唯一时间是停止行为不正确的第三方线程。问题是这样的线程可以捕获并忽略由此触发的错误。如果您确实需要运行不安全或不可靠的代码,我建议您使用可以根据需要终止的单独进程。
简而言之, stop
强行中止线程而不给它任何清理的机会。最典型的结果是一团糟。