如何终止Java中处于RUNNING状态的线程



是否有可能以非编程方式杀死处于状态RUNNING的线程?

我知道*nix中的top命令可以显示线程。我可以在操作系统中杀死线程吗?

我想知道是否有一种方法可以将一个线程链接到一个进程,这样我就可以只杀死特定的线程,而不是应用程序。

我们的代码中有一个bug,在一个同步方法中使一个线程保持在状态RUNNING。线程保持对象上的lock"挂起"应用程序。

错误已修复。但我想知道是否可能。

简短的回答是"也许吧,但你不应该这样做,而且大多数时候它也不会起作用"。

长答案是:

"也许……" 有些JVM实现将java线程映射到操作系统线程,有些则没有。如果JVM映射到本机操作系统线程,您可以使用操作系统提供的某些进程工具(如*nix上的kill)杀死该线程。如果JVM使用绿色线程,这意味着它没有将Java线程映射到操作系统级别的线程,那么使用操作系统级别的工具基本上是不走运的。幸运的是,只有很少的JVM实现做到了这一点。不管JVM以何种方式组织线程,都可以使用的一种方法是使用java调试器。本文描述了这样做的过程:http://www.rhcedan.com/2010/06/22/killing-a-java-thread/。

"but you should not do it"在操作系统级别上终止线程几乎肯定会使JVM处于未定义状态(请阅读"JVM可能会崩溃或删除磁盘上的所有文件,或者做任何它想做的事情")。即使采用调试器方式,也只有非常少量的java应用程序(即"这个星球上没有任何应用程序")能够正确处理外部应用程序杀死其线程之一的事件。因此,这些应用程序将被置于未定义状态(读为"应用程序可能崩溃或删除磁盘上的所有文件或做任何它他妈的喜欢做的事情")。

"大多数情况下它也不会工作"如果线程真的被一些阻塞的IO等卡住,那么杀死线程将不起作用,它将不响应。如果程序卡住了,最好是终止整个程序,找到程序的问题并修复它,而不是终止单个线程。

对于终止线程的所有疑问,请参考以下内容:http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

在linux上,有一个tkill(int tid, int sig)命令,类似于kill

在windows上,ProcessExplorer可以从gui中完成,不知道是否有cli。

相关内容

  • 没有找到相关文章

最新更新