如何杀死状态为RUNNING的Java中的线程?

sse*_*ano 9 java multithreading

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

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

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

我们的代码中有一个错误,它RUNNING在同步方法中保持线程状态.线程保持lock对象"悬挂"应用程序.

错误是固定的.但我想知道是否有可能.

Jan*_*omä 12

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

答案很长的答案是:

"也许......" 有些JVM实现将java线程映射到OS线程,而有些则没有.如果JVM映射到本机OS线程,您可能可以使用操作系统提供的某些进程工具(如kill*nix)来终止该线程.如果JVM执行绿色线程,这意味着它没有将Java线程映射到OS级别线程,那么使用操作系统级别工具基本上是运气不好.幸运的是,只有极少数JVM实现这样做.无论JVM以何种方式组织其线程,都可以使用的方法是使用java调试器.本文介绍了执行此操作的过程:http://www.rhcedan.com/2010/06/22/killing-a-java-thread/.

"但你不应该这样做" 在操作系统级别杀死一个线程几乎肯定会使JVM处于未定义的状态(读取"jvm可能会崩溃或删除磁盘上的所有文件或做任何令人讨厌的事情").即使在使用调试器方式时,只有极少量的java应用程序(读取"此行星上没有应用程序")将正确处理外部应用程序正在杀死其中一个线程的事件.因此,这些应用程序将处于未定义状态(读取"应用程序可能会崩溃或删除磁盘上的所有文件或做任何令人讨厌的事情").

"而且大多数时候它也不会工作" 如果线程确实卡住了一些阻塞的IO等,那么杀死线程将无法正常工作,它将无法响应.如果一个程序被卡住,最好杀死整个程序,找到该程序的问题并修复它而不是杀死一个线程.