如何使用VisualVM或使用unix命令杀死Java线程?
我使用的是Windows 7 OS。我的应用程序中有大约线程。为了测试警报以检查线程的运行状况,我需要手动终止线程并检查警报是否正常工作。我们可以杀死一个线程,就像我们用它杀死一个进程一样吗?6
pid
我使用的是Windows 7 OS。我的应用程序中有大约线程。为了测试警报以检查线程的运行状况,我需要手动终止线程并检查警报是否正常工作。我们可以杀死一个线程,就像我们用它杀死一个进程一样吗?6
pid
Dan Woods在此博客文章中记录了如何杀死线程...https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java-thread他执行的步骤涉及使用调试器(JDB)并在线程的执行中注入异常。具体说来。。。
确保使用以下参数启动 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 上进行连接。
杀死线程。在此示例中,线程名称为“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调试器,就完成了!
没有安全的方法来“杀死”一个线程而不杀死它所在的进程。这不是你故意做的事情。出于测试目的,我会向应用程序添加代码以支持此功能。