0

java-thread-id-and-stack-trace のようなスレッド ID の取得に関する既存の質問を確認しました。

しかし、私は単純に見えるものを理解することができません。Javaでスレッドを停止するJSPツールを作りたいです。

一般的には悪い考えであることはわかっていますが、JBoss のハード化を引き起こす環境で JConsole を使用できないため、これが必要です。

私の質問は、サンプルのjstack出力を取ることです:

  1. 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]ですか?
  2. を Java に変換するにはどうすればよいですか (Java コードは素晴らしいでしょうhex) long
  3. これがうまくいかなかった理由を教えてください ->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 を実行していますか?

4

1 に答える 1

1

自分のスレッドを見つけて停止することしかできません。正常に停止できる場合に備えて、スレッドを中断してみます。

スレッドを停止すると、アプリケーションが一貫性のない状態または回復不能な状態になる可能性があるため、一般に悪い考えです。これを回避できる唯一の方法は、スレッドが実行している可能性のあるすべてのことを正確に理解することです。その場合、コードを修正して正常に停止する方が簡単で優れている可能性があります

私たちの環境ではjconsoleを使用できません

いずれにせよ、jvisualvm ははるかに優れたツールです。あなたがしなければならない場合を除き、私はjconsoleを使用しません。

16進数をJavaロングに変換するにはどうすればよいですか(Javaコードはスーパーでしょう)?

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

これがうまくいかなかった理由を教えてください

同じプロセスからこれを実行しなかったか、ThreadDeathトリガーしたエラーをスレッドがキャッチしました。

于 2012-09-04T07:34:52.047 に答える