Ответ 1
Метод getState()
потока возвращает a Thread.State
, который может быть:
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING или TERMINATED
См. Thread.State.
Есть ли какое-нибудь опрятное решение узнать, когда поток был помещен в статус wait
? Я помещаю потоки в wait
и я notify
их, когда мне это нужно. Но иногда я хочу знать, ждет ли поток в настоящее время, и если да, я должен сделать что-то еще.
Я мог бы, вероятно, сам установить флаг true/false. Но я не могу представить, что есть лучший способ сделать это?
Метод getState()
потока возвращает a Thread.State
, который может быть:
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING или TERMINATED
См. Thread.State.
Вы посмотрели Thread.getState?
Проверка
У вас может быть вся информация, которую вы хотите использовать с помощью ThreadMXBean.
Попробуйте этот код:
package com.secutix.gui.seatmap;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
public class ThreadStatus {
private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
buildAndLaunchThread(i);
}
Thread t = new Thread(){
@Override
public void run() {
while(true){
printThreadStatus();
try {
sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.setName("detector");
t.start();
}
protected static void printThreadStatus() {
ThreadInfo[] infos = mbean.dumpAllThreads(true, true);
for (ThreadInfo threadInfo : infos) {
System.out.println(threadInfo.getThreadName() + " state = " + threadInfo.getThreadState());
}
}
private static void buildAndLaunchThread(int i) {
Thread t1 = new Thread(){
@Override
public void run() {
while(true){
try {
sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t1.setName("t" + i);
t1.start();
}
}