2011-07-26 1 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をint型)しかし、あなたがに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(); 
    } 

は次に、各ThreadInfoには、この方法はThreadMxBean.dumpAllThreads()

+0

おかげから返さ呼び出します。良いポインタ。しかし、返されるThreadInfoの深さを制限する方法があるかどうかを知りたいです。それは私の意見ではAPIの設計における過失です。メソッドに2つの完全に独立したオプションがある場合、ユーザーが両方のオプションを特定できるメソッドのオーバーロードが必要です。 – RAY

+0

ThreadInfoの取得中に最大深度を指定することが重要です。 http://stackoverflow.com/questions/4315753/requesting-a-stack-trace-for-a-java-threadinfo – Deep

関連する問題