Java侦听线程状态

时间:2016-08-31 19:38:34

标签: java multithreading thread-state

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

5 个答案:

答案 0 :(得分:1)

鉴于您不能以that variable is managed by native code的身份在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更改,而这些更改会在毫秒以下发生。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为没有一种很好的方法来以编程方式监控线程状态&#39;但是,您可以使用其中一个分析工具,如VisualVM(还有很多其他工具,但我个人更喜欢这个)。

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

答案 3 :(得分:0)

答案 4 :(得分:0)

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