3.6 你是如何杀死一个线程的? | Java Debug 笔记

177 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:你是如何杀死一个线程的?

回答1: 有关他们为何不赞成使用Sun的内容,Thread.stop()请参见Sun的主题。它详细介绍了为什么这是一个不好的方法,以及通常应该怎样做才能安全地停止线程。

他们推荐的方法是使用共享变量作为标志,要求后台线程停止。然后可以由另一个对象请求线程终止。

sun原文:

为什么不建议使用

因为它本质上是不安全的。停止线程会使它解锁它已锁定的所有监视器。(当ThreadDeath异常在堆栈中传播时,监视器将被解锁 。)如果以前由这些监视器保护的任何对象处于不一致状态,则其他线程现在可能会以不一致状态查看这些对象。当线程对损坏的对象进行操作时,可能会导致任意行为。此行为可能是微妙的,难以检测。与其他未检查的异常不同,它会 无声地杀死线程。因此,用户没有警告其程序可能已损坏。但在实际损坏发生后的任何时间,甚至未来数小时或数天,问题都会显现出来。

回答2:

有一种方法可以做到。但是,如果您必须使用它,则说明您是一个错误的程序员,或者您使用的是错误的程序员编写的代码。因此,您应该考虑停止成为一个糟糕的程序员或停止使用这个糟糕的代码。此解决方案仅适用于别无选择的情况。

Thread f = <A thread to be stopped>
Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} );
m.setAccessible( true );
m.invoke( f , new ThreadDeath() );