可以以非编程方式杀死处于状态RUNNING
的线程吗?
我知道top
中的*nix
命令可以显示线程。我可以杀死操作系统中的线程吗?
我想知道是否有办法将线程链接到进程,因此我只能杀死该特定线程而不是应用程序。
我们的代码中有一个错误,它在同步方法中将状态RUNNING
中的线程保持不变。该线程使对象上的lock
“挂起”应用程序。
错误已修复。但我想知道是否有可能。
答案 0 :(得分:11)
简短的回答是“也许,但你不应该,而且大多数时候它也不会起作用”。
答案很长:
<强> “也许...”强>
一些JVM实现将java线程映射到OS线程,而有些则没有。如果JVM映射到本机OS线程,您可能可以使用操作系统提供的某些处理工具(例如* nix上的kill
)来终止该线程。如果JVM执行绿色线程,这意味着它没有将Java线程映射到OS级别线程,那么使用操作系统级别工具基本上是运气不好。幸运的是,只有极少数JVM实现这样做。无论JVM以何种方式组织其线程,都可以使用的方法是使用java调试器。本文介绍了执行此操作的过程:http://www.rhcedan.com/2010/06/22/killing-a-java-thread/。
“但你不应该这样做” 在操作系统级别上杀死一个线程几乎肯定会使JVM处于未定义状态(读取“jvm可能会崩溃或删除磁盘上的所有文件或做任何令人讨厌的事情”)。即使在使用调试器方式时,只有极少量的java应用程序(读取“此行星上没有应用程序”)将正确处理外部应用程序正在杀死其中一个线程的事件。因此,这些应用程序将处于未定义状态(读取“应用程序可能会崩溃或删除磁盘上的所有文件或做任何令人讨厌的事情”)。
“并且大部分时间它都无效” 如果线程确实卡住了一些阻塞的IO等,那么杀死线程将无法正常工作,它只会不响应。如果一个程序被卡住了,最好杀死整个程序,找到程序的问题并修复它而不是杀死一个线程。
答案 1 :(得分:2)
对于杀死线程的所有疑问,请参阅: http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
答案 2 :(得分:1)
在linux上,有一个tkill(int tid, int sig)
命令,类似于kill
。
在Windows上,ProcessExplorer
可以从gui执行,不知道是否有任何cli。
答案 3 :(得分:0)
Thread.interrupt
方法..
或者如果你正在使用线程池,那么executorService.shutdown() and executorService.shutdownNow() should be used to shutdown the thread