突然终止线程

时间:2015-02-17 17:23:50

标签: java linux windows multithreading jvm

在C和C ++中,当您调用TerminateThread(Windows)或pthread_kill(Linux)时,它可能会泄漏已分配的资源,这些资源在此类突然线程死亡之前未被释放。这些是特定于操作系统的强制终止线程的调用。发生这种情况时,不会调用C ++中的析构函数。

当你致电Thread.stop()时,Java会发生同样的事吗? JVM是否在所述线程突然终止之前收集在线程生命周期内分配的所有对象?或者它也泄漏了吗?

2 个答案:

答案 0 :(得分:3)

当JVM终止一个线程时,相应的堆栈和引用将被清除,因此这些引用专门引用的对象将成为垃圾收集的候选对象。

Thread.stop()已弃用,您不应该调用它。 From the doc

  

停止线程会导致它解锁它拥有的所有监视器   锁定。 (监视器作为ThreadDeath异常解锁   向上传播。)如果以前受保护的任何对象   由这些监视器处于不一致的状态,其他线程现在可能   以不一致的状态查看这些对象。据说这样的对象   被损坏了。当线程对受损对象进行操作时,任意   行为可能导致。这种行为可能很微妙而且很难   检测,或者可能发音

所以这与资源分配问题无关,而是对象完整性。

答案 1 :(得分:1)

查看此页面以获取Java 8 http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

  

为什么不推荐使用Thread.stop?

     

因为它本质上是不安全的。停止线程会导致它解锁已锁定的所有监视器。 (当ThreadDeath异常向上传播时,监视器将被解锁。)如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可以以不一致的状态查看这些对象。据说这些物体已被损坏。当线程对受损对象进行操作时,可能会导致任意行为。这种行为可能很微妙并且难以检测,或者可能是明显的。与其他未经检查的异常不同,ThreadDeath会以静默方式杀死线程;因此,用户没有警告他的程序可能被破坏。腐败可以在实际损害发生后的任何时间显现,甚至在未来几小时或几天。