如何使用VisualVM或使用unix命令杀死Java线程?

2022-09-01 21:41:31

我使用的是Windows 7 OS。我的应用程序中有大约线程。为了测试警报以检查线程的运行状况,我需要手动终止线程并检查警报是否正常工作。我们可以杀死一个线程,就像我们用它杀死一个进程一样吗?6pid


答案 1

Dan Woods在此博客文章中记录了如何杀死线程...https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java-thread他执行的步骤涉及使用调试器(JDB)并在线程的执行中注入异常。具体说来。。。

  1. 确保使用以下参数启动 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 上进行连接。

  2. 识别有问题的线程:
  3. 杀死线程。在此示例中,线程名称为“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调试器,就完成了!


答案 2

没有安全的方法来“杀死”一个线程而不杀死它所在的进程。这不是你故意做的事情。出于测试目的,我会向应用程序添加代码以支持此功能。