【发布时间】:2016-08-31 19:38:33
【问题描述】:
出于调试目的,我想监听线程状态。我希望它在线程等待日志以及“恢复”时打印通知。
【问题讨论】:
-
一种廉价的方法是使用
jstack之类的工具进行线程转储。
标签: java multithreading thread-state
出于调试目的,我想监听线程状态。我希望它在线程等待日志以及“恢复”时打印通知。
【问题讨论】:
jstack 之类的工具进行线程转储。
标签: java multithreading thread-state
鉴于您不能在 java.lang.Thread 上将 private volatile int threadStatus; 听成 that variable is managed by native code .
// keep old values in a map like this
HashMap<Thread, ThreadStatus> threadMap;
// loop all threads
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
ArrayList<Thread> threadArrayList = new ArrayList<>(threadSet);
for (Thread thread : threadArrayList) {
// check if thread.getState() has changed, update accordingly
}
请注意,除了效率不高之外您会错过很多 ThreadStatus 更改,这些更改会在亚毫秒内发生。
【讨论】:
线程的getState()方法返回一个Thread.State,它可以是:
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 或 TERMINATED
Thread.State state = getThreadInQuestion().getState();
if(state == Thread.State.WAITING) {
System.out.println("Waiting");
} else if(state == Thread.State.RUNNABLE) {
System.out.println("Running");
}else{
System.out.println("Neither running nor waiting")
}
【讨论】:
我认为没有“以编程方式”监控线程状态的好方法。但是,您可以使用像 VisualVM 这样的分析工具之一(还有很多其他工具,但我个人更喜欢这个)。
您也可以参考这个官方documentation,了解如何使用 VisualVM 监控应用程序的线程。
【讨论】:
【讨论】:
您可以扩展 Thread 类,并且在您的类中您可以允许在您的类中注册一个侦听器,并且每次状态更改时,您的 Thread 都会通知它。这是可能的,但我认为这将成为非常复杂的解决方案,因为您必须确保代码中的所有线程都在使用您的类而不是常规线程。简而言之,恕我直言,它不值得大吵大闹
【讨论】: