static S renderUserThreadsWithStackTraces() { ret renderUserThreadsWithStackTraces(Thread.getAllStackTraces()); } static S renderUserThreadsWithStackTraces(Map threadMap) { ret renderUserThreadsWithStackTraces(threadMap, "user thread"); } static S renderUserThreadsWithStackTraces(Map threadMap, S threadDescription) { new StringBuilder buf; int n = 0; for (Thread t : threadMap.keySet()) { ThreadGroup g = t.getThreadGroup(); if (g != null && g.getName().equals("system")) continue; ++n; printTo(buf, t); for (StackTraceElement e : threadMap.get(t)) { printTo(buf, " " + e); } printTo(buf); } printTo(buf, n(n, threadDescription) + "."); ret asciiHeading2(n(n, threadDescription) + " (+" + (l(threadMap)-n) + ")") + "\n" + buf; }