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

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

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

丹·伍兹在本博客文章中记录了如何杀死一个post… https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java -thread他执行的步骤涉及使用调试器(JDB)并在线程的执行中注入exception。 特别…

  1. 确保使用以下参数启动java程序:

    -Dcom.sun.management.jmxremote.port = 50199
    -Dcom.sun.management.jmxremote.authenticate = FALSE
    -Dcom.sun.management.jmxremote.ssl = FALSE
    -Xrunjdwp:运输= dt_socket,地址= 50100,服务器= Y,暂停=正

    这将允许我们在识别出导致问题的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-- 

我们要杀死的线程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调试器,你就完成了!

这不是真的。 您可以随时使用GDB附加到JVM进程,如果您知道线程ID,则执行pthread_kill调用。 你只需要从java线程转换(做一个kill -3)转换,它给你一个hexid,(本机id),然后查看GDB中的线程列表(信息线程)并找到真正的线程id。

事实certificate这是有效的。

彼得说,你不能安全地做到这一点。 事实上,在某些平台上, Thread.kill甚至没有实现。 然而:

  • 如果这只是用于测试,那么调用Thread.kill的unit testing将是合理的……假设它在需要工作的测试平台上工作。 (源代码中的“响亮”评论是为了帮助人们移植unit testing……)

  • 另一种方法是向线程runnable添加一些代码,允许你的unit testing告诉它死掉。 如果线程代码需要(几乎)生产代码才能工作,那么你可以创建一个子类来覆盖某些东西,以便它以适合你的目的“破坏”…进行测试。 实际上,这种方法允许您以受控方式使线程“中断”,从而可能允许您测试警报代码的不同方面。

你不能从外部(操作系统或调试器)做到这一点,你必须编写自己的线程看门狗,它可以与用户交互并杀死你想要的线程。

尝试在这里查看如何使用java处理信号

在java中,你不能杀掉像unix这样的东西。 您可以在java interrupt ,也可以在unix中终止进程。

在线程中等待一段时间并在代码中杀死线程 – 简单的方法。