java-thread-id-and-stack-trace のようなスレッド ID の取得に関する既存の質問を確認しました。
しかし、私は単純に見えるものを理解することができません。Javaでスレッドを停止するJSPツールを作りたいです。
一般的には悪い考えであることはわかっていますが、JBoss のハード化を引き起こす環境で JConsole を使用できないため、これが必要です。
私の質問は、サンプルのjstack出力を取ることです:
Event Batch Processing (Spring UAA/1.0.2)" daemon prio=10 tid=0x0000000041e27800 nid=0x363b waiting on condition [0x00007f9a89267000]
これから、どの id が でthread.getId()
定義されているようになりjava.lang.Thread
ますか? この行の最後のトークンは何[0x00007f9a89267000]
ですか?- を Java に変換するにはどうすればよいですか (Java コードは素晴らしいでしょう
hex
)long
。 これがうまくいかなかった理由を教えてください ->
tid=
終わりのないループでハングしたスレッドの jstack から 16 進数を取得しました。次に、これを行いました: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、プログラマー モード (16 進数) に貼り付けてから、[12 月] をクリックしました。
アップデート:
私のテスト コードでは、無限にループする JSP を作成し、10000 回の反復ごとに 1 つの文字を出力し、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 を数回実行し、毎回このエントリを取得しました。
しかし、スレッドを使用して JSP を実行するとid = 000000000d4eb000
、それが見つかりません。アプリ コンテナーがスレッドに一意の名前を付けているため、スレッドを見つけることができ、印刷すると次のようになります。
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.
0x000000000d4eb000
では、内部 JVM が として
認識しているように、どの jstack が明らかに識別しているの1389 hex :56d
でしょうか? 最後に、名前で検索してスレッドを停止するように JSP を変更しました。幸いなことに、スレッド名はすべて異なります。しかし、これはバグですか? Windows、JBoss 4.2、Java 1.6 update 32 を実行していますか?