【问题标题】:Java listen on Thread stateJava 监听线程状态
【发布时间】:2016-08-31 19:38:33
【问题描述】:

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

【问题讨论】:

  • 一种廉价的方法是使用jstack 之类的工具进行线程转储。

标签: java multithreading thread-state


【解决方案1】:

鉴于您不能在 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 更改,这些更改会在亚毫秒内发生。

【讨论】:

    【解决方案2】:

    线程的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")
    }
    

    【讨论】:

    • 这只是部分答案,甚至可能不是。你怎么知道什么时候打印?也就是OP怎么知道线程已经恢复了?
    • 另外,你想把这段代码放在哪里?线程状态可以经常改变。你的代码不是监听器声明,它有点像监视器
    【解决方案3】:

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

    您也可以参考这个官方documentation,了解如何使用 VisualVM 监控应用程序的线程。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-15
          • 1970-01-01
          • 1970-01-01
          • 2021-02-17
          • 2017-05-31
          • 1970-01-01
          • 2011-10-06
          相关资源
          最近更新 更多