2012-09-04 70 views
0

我看看現有的問題獲得線程ID像java-thread-id-and-stack-tracejstack輸出 - 得到tid的java Thread.getId

但我無法弄清楚看起來很簡單的事情。我想製作一個JSP工具來停止Java中的線程。

我知道這是一個不錯的主意,但我們需要它,因爲我們的環境中無法使用JConsole,導致JBoss的硬化。

我的問題是,採取抽樣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代碼會超級)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粘貼計算,編程模式(十六進制),然後單擊十二月

UPDATE:

在我的測試代碼時,我作出無限循環一個JSP,輸出炭每隔幾10000S迭代 - 然後做一個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. 

那麼jstack顯然識別爲0x000000000d4eb000內部JVM知道爲 1389 hex :56d?最後將JSP更改爲按名稱搜索並停止線程。幸運的是,線程名稱都是不同的。但是,這是一個錯誤 - 運行Windows,JBoss 4.2,Java 1.6更新32?

+0

'然後我做到了這一點:'如果我們能看到你做了什麼,這將有所幫助。 –

+0

抱歉,剛格式化了問題並添加了代碼。我的無腳本阻止編輯器控件 – tgkprog

回答

1

你只能找到並停止你自己的線程。我會嘗試中斷線程,以防止它可以正常停止。

停止線程通常是一個壞主意,因爲它會使應用程序處於不一致或不可恢復的狀態。你能避免這個問題的唯一辦法是有一個很好的理解每一件事線程可能會做的,在什麼情況下,它可能是固定的代碼,以便它停止優雅的簡單,更好

我們不能使用的JConsole在我們的環境中

jvisualvm在任何情況下都是一個更好的工具。我不會使用syou不得不使用的jconsole。

我該如何轉換(java代碼會超級)十六進制爲一個java長?

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

你能告訴我爲什麼這個沒有工作

要麼你沒有從同一個進程中運行這個或線程發現你觸發了ThreadDeath錯誤。

+0

它的一個servlet,所以一個線程由我的應用程序容器(jboss)啓動;我可以在jstack中看到線程名稱。你說的是Thread.getAllStackTraces(); 不會返回由jboss啓動的所有線程。 'Thread.getAllStackTraces();' 在同一個jboss中的jsp中被調用? – tgkprog

+0

我希望它能夠返回所有相同的線程。我建議你用十六進制打印出所有線程的名稱和ID,看看你是否能看到一個匹配。 –

+1

謝謝彼得我嘗試了你的建議,把結果放在主要問題 - 標記爲「更新」。不知道爲什麼,但由jconsole返回的tid與我從'Thread.getAllStackTraces()'得到的不匹配 – tgkprog