2011-07-26 17 views
2

我正在嘗試編寫一些線程管理實用程序,並閱讀ThreadMXBean。ThreadMXBean.dumpAllThreads()maxDepth

http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html#dumpAllThreads(boolean, boolean)

根據商務部,getThreadInfo(長[] IDS,詮釋MAXDEPTH)「沒有獲得鎖定的監視器和線程鎖定同步」,然而,這些方法允許您指定true獲取鎖定/監視器信息似乎無法使您指定maxDepth。

有什麼我可以做的,以指定是否獲得顯示器/鎖定信息以及堆棧深度?

在此先感謝!

回答

4

您可以複製從一個ThreadInfo了toString(),但除去堆棧深度的限制給你:

public String dump(ThreadInfo info) { 

     StringBuilder sb = new StringBuilder("\"" + info.getThreadName() + "\"" 
       + " Id=" + info.getThreadId() + " " + info.getThreadState()); 
     if (info.getLockName() != null) { 
      sb.append(" on " + info.getLockName()); 
     } 
     if (info.getLockOwnerName() != null) { 
      sb.append(" owned by \"" + info.getLockOwnerName() + "\" Id=" 
        + info.getLockOwnerId()); 
     } 
     if (info.isSuspended()) { 
      sb.append(" (suspended)"); 
     } 
     if (info.isInNative()) { 
      sb.append(" (in native)"); 
     } 
     sb.append('\n'); 
     int i = 0; 
     for (; i < info.getStackTrace().length; i++) { 
      StackTraceElement ste = info.getStackTrace()[i]; 
      sb.append("\tat " + ste.toString()); 
      sb.append('\n'); 
      if (i == 0 && info.getLockInfo() != null) { 
       Thread.State ts = info.getThreadState(); 
       switch (ts) { 
       case BLOCKED: 
        sb.append("\t- blocked on " + info.getLockInfo()); 
        sb.append('\n'); 
        break; 
       case WAITING: 
        sb.append("\t- waiting on " + info.getLockInfo()); 
        sb.append('\n'); 
        break; 
       case TIMED_WAITING: 
        sb.append("\t- waiting on " + info.getLockInfo()); 
        sb.append('\n'); 
        break; 
       default: 
       } 
      } 

      for (MonitorInfo mi : info.getLockedMonitors()) { 
       if (mi.getLockedStackDepth() == i) { 
        sb.append("\t- locked " + mi); 
        sb.append('\n'); 
       } 
      } 
     } 
     if (i < info.getStackTrace().length) { 
      sb.append("\t..."); 
      sb.append('\n'); 
     } 

     LockInfo[] locks = info.getLockedSynchronizers(); 
     if (locks.length > 0) { 
      sb.append("\n\tNumber of locked synchronizers = " + locks.length); 
      sb.append('\n'); 
      for (LockInfo li : locks) { 
       sb.append("\t- " + li); 
       sb.append('\n'); 
      } 
     } 
     sb.append('\n'); 
     return sb.toString(); 
    } 

然後調用來自ThreadMxBean.dumpAllThreads()

+0

謝謝返回此方法對每個線程信息。好的指針。很想看看是否有辦法限制返回的ThreadInfos的深度。在我看來,這是對API設計的疏忽。如果方法中有兩個完全獨立的選項,那麼*應該*是方法的一個重載,用戶可以指定兩個選項。 – RAY

+0

重要的是要提到獲取ThreadInfo時的最大深度。 http://stackoverflow.com/questions/4315753/requesting-a-stack-trace-for-a-java-threadinfo – Deep

相關問題