如何使用VisualVM或使用unix命令终止java线程?

Aru*_*run 22 java multithreading

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

buz*_*791 37

丹·伍兹在本博客文章中记录了如何杀死一个帖子... 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 ,暂停= N

    这将允许我们在识别出导致问题的Thread之后将java调试器附加到正在运行的进程.此外,请确保正确设置iptables,以便仅允许来自您管理的主机/工作站的50100和50199上的连接.

  2. 识别违规线程:
  3. 杀死线程.在此示例中,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--
Run Code Online (Sandbox Code Playgroud)

我们要杀死的线程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]
Run Code Online (Sandbox Code Playgroud)

退出java调试器,你就完成了!

  • 还有命令:interrupt [threadid] (2认同)

Pet*_*rey 15

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


小智 7

这不是真的.您始终可以使用GDB附加到JVM进程,并在知道线程ID时调用pthread_kill.你只需要从java线程转换(做一个kill -3)转换,它给你一个十六进制id,(本机id),然后查看GDB中的线程列表(信息线程)并找到真正的线程id.

事实证明这是有效的.