出于调试目的,我想听一个线程状态。我想让它在线程等待日志时以及每次“恢复”时打印通知。
答案 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类,在你的类中你可以允许一个监听器在你的类中注册,每次状态改变时,你的线程都会通知它。这是可能的,但我认为它将成为非常复杂的解决方案,因为您必须确保代码中的所有线程都使用您的类而不是常规线程。简而言之,恕我直言,它不值得啰嗦