2010-12-06 109 views

回答

3

jVisualVM是你的朋友對這種調試。它位於JDK安裝的/ bin目錄中。將所有線程顯示爲圖形視圖,並允許您深入瞭解他們正在做的事情。 Thread Dump按鈕將打印出所有當前的堆棧跟蹤,以便您可以查看是否有東西卡在用戶代碼的某處。

+1

+1 JVisualVM是一個很棒的工具。我更喜歡JConsole來檢查單個線程,但JVisualVM的Thread Dump功能非常棒。我希望它可以將它轉儲到允許文本搜索/突出顯示的顯示器上。 – 2010-12-06 23:30:16

+0

我使用fgrep來查找文本。例如jstack | fgrep「com.bla.foo」 – 2010-12-06 23:41:38

+0

@Tim:是的。我只是將轉儲複製/粘貼到我的文本編輯器中。 – 2010-12-06 23:52:25

5

使用'jps'命令行工具查看活動java進程和jstack以顯示活動線程。

jstack doc

example

3

如果你正在尋找一個綱領性的解決方案,這樣的事情(在JDK 1.5或更高版本)應該工作:

Map<Thread, StackTraceElement[]> stack = Thread.getAllStackTraces(); 
for (Map.Entry<Thread, StackTraceElement[]> entry : stack.entrySet()) { 
    System.out.println("Thread named '" + 
         entry.getKey().getName() + 
         "' is alive"); 
} 
0

「似乎有一個或多個線程意外不會中斷」。我沒有說事情沒有中斷。調用Thread.interrupt()不會強制runnable停止。它設置中斷標誌,並可能導致阻塞操作(如Thread.sleep或java.nio調用)拋出InterruptedException或其他異常(如nio的ClosedByInterruptException)。你的runnable必須檢查Thread.currentThread()。isInterrupted()並且表現得很好。