我正在使用 Windows 7 操作系统。我的应用程序中有大约 6
个线程。为了测试警报以检查线程的健康状况,我需要手动终止线程并检查警报是否正常工作。我们可以像用 pid
杀死一个进程一样杀死一个线程吗?
最佳答案
Dan Woods 在此博客条目中记录了如何杀死线程... https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java-thread 他执行的步骤涉及使用调试器 (JDB) 并在线程执行中注入(inject)异常。具体...
确保使用以下参数启动您的 java 程序:
-Dcom.sun.management.jmxremote.port=50199
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Xrunjdwp:transport=dt_socket,address=50100,server=y,suspend=n这将允许我们将 java 调试器附加到正在运行的进程,之后 我们确定是哪个线程导致了问题。另外,请确保 你有你的 iptables 设置适当,以便只允许 来自您管理的主机/工作站的 50100 和 50199 连接。
- 找出有问题的线程:
杀死线程。在此示例中,ThreadName 为“btpool0-0?”。启动 java 调试器(也随 JDK 发行版一起提供),并附加到正在运行的 JVM……
[root@host ~]# jdb -attach 50100
获取一个正在运行的线程列表——这也会给我们 JVM 看到的线程 ID:
> threads
--snip--
(org.mortbay.thread.BoundedThreadPool$PoolThread)0x25cb
btpool0-0 running
--snip--
我们要杀死的线程 id 是“0x25cb”。杀死线程的第一步是跳进去,然后挂起……
thread 0x25cb
btpool0-0[1] suspend 0x25cb
btpool0-0[1] step
Step completed: <... snip ...>
btpool0-0[1] kill 0x25cb new java.lang.Exception()
killing thread: btpool0-0
btpool0-0[1] instance of
com.site.package.name(name='btpool0-0', id=9675) killed btpool0-0[1]
退出java调试器,大功告成!
关于java - 如何使用 VisualVM 或使用 unix 命令杀死 java 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11610902/