2

出于调试目的,我想监听线程状态。我希望它在线程等待日志以及“恢复”时打印通知。

4

5 回答 5

1

鉴于您无法监听该变量private volatile int threadStatus;java.lang.Thread因为该变量由本机代码管理,我能想到的唯一方法是拥有一个并行线程,该线程具有每 x 毫秒/秒运行一次并适当输出的方法。

// 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 更改。

于 2018-11-21T19:10:24.703 回答
0

您可以扩展 Thread 类,并且在您的类中,您可以允许在您的类中注册一个侦听器,并且每次状态更改时,您的 Thread 都会通知它。这是可能的,但我认为这将成为非常复杂的解决方案,因为您必须确保代码中的所有线程都在使用您的类而不是常规线程。简而言之,恕我直言,这不值得

于 2016-09-01T14:37:15.207 回答
0

线程的 getState() 方法返回一个 Thread.State,它可以是:

新的、可运行的、阻塞的、等待的、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")
}
于 2016-08-31T19:59:11.010 回答
0

我认为没有“以编程方式”监视线程状态的好方法。但是,您可以使用VisualVM之类的分析工具之一(还有很多其他工具,但我个人更喜欢这个)。

您还可以参考此官方文档,了解如何使用 VisualVM 监控应用程序的线程。

于 2016-08-31T21:06:15.030 回答
0

使用VisualVM 线程监控

于 2016-08-31T21:22:33.980 回答