如何检查线程是否诞生?

时间:2014-12-11 11:57:16

标签: java android multithreading java.util.concurrent

我创建了一个实用程序类,用于获取有关正在运行的线程的信息。按下按钮时会启动一个名为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.");

             }
         }

2 个答案:

答案 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}}