あなたはこの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()
おかげから返さ呼び出します。良いポインタ。しかし、返されるThreadInfoの深さを制限する方法があるかどうかを知りたいです。それは私の意見ではAPIの設計における過失です。メソッドに2つの完全に独立したオプションがある場合、ユーザーが両方のオプションを特定できるメソッドのオーバーロードが必要です。 – RAY
ThreadInfoの取得中に最大深度を指定することが重要です。 http://stackoverflow.com/questions/4315753/requesting-a-stack-trace-for-a-java-threadinfo – Deep