2014-12-11 2 views
1

Я создал класс утилиты для получения информации о работающих потоках. один поток, называемый 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 только один раз, как назвав его снова и снова не даст вам постоянное значение множества/массив (представьте создание нового потока или выход из потока) и, следовательно, создаст проблему.

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; 
} 

Это то, что апи должен сказать getAllStackTraces метод

A zero-length array will be returned in the map value if the virtual machine has no stack trace information about a thread. 
+0

благодарю вас за ответ, но что такое wron в моем коде – rmaik

+0

Я обновил ответ с помощью вашего кода. – SMA

+1

нормально, но когда я запускаю ThreadsUtility.getAllRunninthreads(); метод, он ives меня всех доступных потоков, но тот, который я смотрел? это потому, что поток прекращается, когда он заканчивает свою работу? – rmaik

0

В Thread.getAllStackTraces().keySet(); отображает все доступные потоки п стека, но не прерванного из них. Итак, я думаю, что ваша «mqtt thread» может не делать тяжелую работу, которая потребляет время, поэтому к тому времени, когда вы нажмете кнопку «play», поток, возможно, завершил свою работу и, следовательно, ТЕРМИНАЦИИ и не будут перечислены в

Смежные вопросы