java - jstack 输出 - 获取 java Thread.getId 的 tid

标签 java multithreading jconsole jstack

我查看了有关获取线程 ID 的现有问题,如 java-thread-id-and-stack-trace .

但我无法弄清楚一些看似简单的事情。我想制作一个JSP工具来停止Java中的线程。

我知道这通常是一个坏主意,但我们需要它,因为我们无法在我们的环境中使用 JConsole,导致 JBoss 的一些强化。

我的问题是,获取示例 jstack 输出:

  1. 事件批处理(Spring UAA/1.0.2)”守护进程 prio=10 tid=0x0000000041e27800 nid=0x363b 等待条件 [0x00007f9a89267000] 由此,哪个 id 将是 java.lang.Thread 中定义的 thread.getId() ?此行中的最后一个标记是什么[0x00007f9a89267000]
  2. 如何将(Java 代码 super )hex 转换为 Java long
  3. 你能告诉我为什么这不起作用 -> 我从卡在永无休止的循环中的线程的 jstack 中获取了一个十六进制 tid= 。然后我这样做了:

    Thread thrd = null;
    String thrdId =request.getParameter("thrd");
    if(thrdId != null){
        out.print("thread " + thrdId + " :");
        out.flush();
        Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
        Set tt = map.keySet();
        Iterator<Thread> ti = tt.iterator();
        try{
            long idFind = Long.parseLong(thrdId);
            out.print("<br> idFind thread |" + idFind + "| <br>");
            boolean found = false;
            while(ti.hasNext() ){
                thrd = ti.next();
                if(thrd.getId() == idFind){
                    out.print("<br> stopping thread " + thrd + " <br>");
                    out.flush();
                    thrd.stop();
                    out.print("<br>stopped " );
                    found = true;
                    break;
                }
            }
            if(!found){
                out.print("<br>not found " );
    
            }
        }catch(Exception e){
            out.println("<br>err " + e + "<br>");
        }
    
    }
    

未找到此输出。输入参数是 tid - 粘贴在 Windows 7 calc 中,程序员模式(十六进制),然后单击 Dec。

更新:

在我的测试代码中,当我制作一个无限循环的 JSP 时,每隔 10000 次迭代输出一个 char - 然后做了一个 jstack,得到:

"http-0.0.0.0-8181-4" daemon prio=6 tid=0x000000000d4eb000 nid=0x2f58 waiting on condition [0x0000000010fee000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)

...(stack trace)
at org.apache.jsp.t.testing.loop_jsp._jspService(loop_jsp.java
...more stack trace...

我运行了 jstack 几次,每次都会得到这个条目。

但是当我使用线程 id = 000000000d4eb000 运行 JSP 时,它找不到它,因为应用程序容器唯一地命名线程,我能够找到该线程,并且当我打印时:

out.print("" + cnt + " \"" + thrd.getName() + "\"| id :" + thrd.getId() + "| hex :" +  Long.toHexString(thrd.getId()) + "| <br>");

我明白了:

93 "http-0.0.0.0-8181-4"| id :1389| hex :56d| 

93 is the thread number in my internal counter in the loop.

所以 jstack 明显识别为 0x000000000d4eb000 内部 JVM 知道的是 1389 十六进制:56d?最后将 JSP 更改为按名称搜索并停止线程。幸运的是,线程名称都不同。但这是一个错误 - 运行 Windows、JBoss 4.2、Java 1.6 update 32 吗?

最佳答案

您只能查找并停止您自己的线程。我会尝试中断线程,以防它可以正常停止。

停止线程通常是一个坏主意,因为它会使应用程序处于不一致或不可恢复的状态。避免这种情况的唯一方法是很好地理解线程可能正在执行的所有操作,在这种情况下,修复代码以使其正常停止可能会更简单更好

we cant use jconsole in our environment

无论如何,jvisualvm 都是一个更好的工具。除非你不得不这样做,否则我不会使用 jconsole。

how do I convert (java code would be super) the hex to a java long?

long idFind = Long.parseLong(thrdId, 16);

could you tell me why this did not work

您没有从同一进程运行此命令,或者线程捕获了您触发的 ThreadDeath 错误。

关于java - jstack 输出 - 获取 java Thread.getId 的 tid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12258589/

相关文章:

java - 启用 jmxremote 的 JBoss 4.2.2 上的 JBossWS 中的 NPE

java - 无法使用 VisualVM 连接到远程 JMX,但可以使用 JConsole

java - 从扫描线上抓取 double 。

java - java中的正则表达式模式失败,但在其他方面工作正常

java - 多重继承或多接口(interface)

java - 使用线程时 Swing GUI 不显示

c# - 多线程时锁定单个 bool 变量?

python - 从 raw_input() 读取输入,而不会让 Python 中的其他线程覆盖提示符

jmx - 有人曾经使用过远程 JMX JConsole 吗?

java - jar 可执行文件中的音频读取