Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadMXBean.dumpAllThreads()maxDepth_Java_Multithreading - Fatal编程技术网

Java ThreadMXBean.dumpAllThreads()maxDepth

Java ThreadMXBean.dumpAllThreads()maxDepth,java,multithreading,Java,Multithreading,我正在尝试编写一些线程管理实用程序,并阅读ThreadMXBean 根据文档,getThreadInfo(long[]ids,int maxDepth)“不获取线程的锁定监视器和锁定同步器”,但是,那些允许您指定true以获取锁定/监视器信息的方法似乎不允许您指定maxDepth 是否可以指定是否获取监视器/锁信息以及堆栈深度 提前谢谢 您可以从ThreadInfo复制toString(),但要实现以下目的,请删除堆栈深度限制: public String dump(ThreadInf

我正在尝试编写一些线程管理实用程序,并阅读ThreadMXBean

根据文档,getThreadInfo(long[]ids,int maxDepth)“不获取线程的锁定监视器和锁定同步器”,但是,那些允许您指定true以获取锁定/监视器信息的方法似乎不允许您指定maxDepth

是否可以指定是否获取监视器/锁信息以及堆栈深度

提前谢谢

您可以从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){
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(“所有者\”+info.getLockOwnerName()+“\”Id=”
+info.getLockOwnerId());
}
如果(信息发布()){
某人附加(“(暂停)”);
}
if(info.isInNative()){
某人附加(“(本地)”);
}
sb.追加('\n');
int i=0;
对于(;i0){
sb.append(“\n\t锁定同步器的数量=“+locks.length”);
sb.追加('\n');
用于(锁信息li:锁){
sb.追加(“\t-”+li);
sb.追加('\n');
}
}
sb.追加('\n');
使某人返回字符串();
}

然后为从ThreadMxBean.dumpAllThreads()返回的每个ThreadInfo调用此方法。

谢谢。好球。我很想看看是否有办法限制返回的ThreadInfos的深度。在我看来,这是API设计中的疏忽。如果一个方法中有两个完全独立的选项,那么应该有一个方法重载,用户可以指定这两个选项。重要的是在获取ThreadInfo时要提到最大深度。