我创建了一个实用程序类,用于获取有关正在运行的线程的信息。按下按钮时会启动一个名为MQTT_THREAD
的线程。我有一个名为play
的另一个按钮,当按下时,它应首先检查线程MQTT_THREAD
是否存在,或者换句话说,是否出生。
在运行时,我按下启动MQTT_THREAD
的按钮,当我按下play
按钮时,它会显示the thread MQTT_THREAD is not existing
。我相信它最常见的是因为我的暗示线程或逻辑中的小错误。以下是我的代码。
请好好看看,让我知道我在想什么。
使用的Code_utitlity方法
public static Thread[] getAllRunninthreads() {
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
return threadArray;
}
public static boolean isThreadExist(String threadName) {
boolean isExist = false;
for (int i = 0; i < ThreadsUtility.getAllRunninthreads().length; i++) {
if (ThreadsUtility.getAllRunninthreads()[i].getName().equals(threadName)) {
return (isExist = true);
}
}
return isExist;
}
Code_at主线程:
if (e.getSource() == Bplay) {
if (!ThreadsUtility.isThreadExist(MQTT_THREAD)) {
System.out.println(MQTT_THREAD + " is not existing.");
}else {
System.out.println(MQTT_THREAD + " exists.");
if (!ThreadsUtility.isThreadExist(FILE_THREAD)) {
System.out.println(FILE_THREAD + " is not existing.");
}else {
System.out.println(FILE_THREAD + " exists.");
}
}
答案 0 :(得分:0)
尝试再次调用getAllRunninThreads
再一次调用它并再次不会给你一致的set / array值(想象一下创建新线程或退出一个线程),因此会产生问题。
public static boolean isThreadExist(String threadName) {
Thread[] threads = ThreadsUtility.getAllRunninthreads();
for (int i = 0; i < threads.length; i++) {
if (threads[i].getName().equals(threadName)) {
return true;
}
}
return false;
}
这就是api对getAllStackTraces方法
所说的话 A zero-length array will be returned in the map value if the virtual machine has no stack trace information about a thread.
答案 1 :(得分:0)
Thread.getAllStackTraces().keySet();
显示堆栈中的所有可用线程,但不显示TERMINATED的线程。因此,我认为你的“mqtt线程”可能不会耗费大量时间,因此,当你按下“播放”按钮时,线程可能已完成其工作,因此,TERMINATED并且不会列在{{ 1}}