From 9c6cfc9757f705f0fed5b1e7f7829e5eae0222ce Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Fri, 15 May 2020 19:59:12 +0800 Subject: [PATCH] fix thread command cause application InterruptedException problem. #1175 --- .../command/monitor200/ThreadCommand.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java index d0b41ccab..eb8a5f44b 100755 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ThreadCommand.java @@ -52,7 +52,10 @@ public class ThreadCommand extends AnnotatedCommand { private int sampleInterval = 100; private String state; - { + private boolean lockedMonitors = false; + private boolean lockedSynchronizers = false; + + static { states = new HashSet(State.values().length); for (State state : State.values()) { states.add(state.name()); @@ -89,6 +92,18 @@ public class ThreadCommand extends AnnotatedCommand { this.state = state; } + @Option(longName = "lockedMonitors", flag = true) + @Description("Find the thread info with lockedMonitors flag, default value is false.") + public void setLockedMonitors(boolean lockedMonitors) { + this.lockedMonitors = lockedMonitors; + } + + @Option(longName = "lockedSynchronizers", flag = true) + @Description("Find the thread info with lockedSynchronizers flag, default value is false.") + public void setLockedSynchronizers(boolean lockedSynchronizers) { + this.lockedSynchronizers = lockedSynchronizers; + } + @Override public void process(CommandProcess process) { Affect affect = new RowAffect(); @@ -176,7 +191,7 @@ public class ThreadCommand extends AnnotatedCommand { int status = 0; Map topNThreads = ThreadUtil.getTopNThreads(sampleInterval, topNBusy); Long[] tids = topNThreads.keySet().toArray(new Long[0]); - ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(ArrayUtils.toPrimitive(tids), true, true); + ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(ArrayUtils.toPrimitive(tids), lockedMonitors, lockedSynchronizers); if (threadInfos == null) { process.write("thread do not exist! id: " + id + "\n"); status = 1; @@ -192,7 +207,7 @@ public class ThreadCommand extends AnnotatedCommand { private int processThread(CommandProcess process) { int status = 0; String content; - ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(new long[]{id}, true, true); + ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(new long[]{id}, lockedMonitors, lockedSynchronizers); if (threadInfos == null || threadInfos[0] == null) { content = "thread do not exist! id: " + id + "\n"; status = 1;