Как проверить, работает ли поток Android

Есть ли способ проверить, запущен ли объект Thread уже на нем?

Я пытаюсь сделать что-то вроде:

if(rt.isAlive() == true)
{
    Log.v(TAG, "START RECORD");
    rt.recording = true;
}
else
{
    Log.v(TAG, "START THREAD/RECORD");

    rt.start();
}

где он запустит поток, если он еще не запущен.

Ответы

Ответ 1

Предполагая, что rt является Thread, просто проверьте rt.isAlive().

В качестве альтернативы просто используйте флаг boolean и установите его в true до начала потока.

Я бы предпочел логический подход, так что основной поток не может запустить второй поток дважды - может быть небольшая задержка до тех пор, пока ваш поток не будет запущен и если ваш основной поток попытается запустить поток дважды в быстрой последовательности, он может получить "ложный" отрицательный результат на rt.isAlive().

Ответ 2

Я использовал этот подход с успехом:

if ( mythread.getState() == Thead.State.NEW )
    //then we have a brand new thread not started yet, lets start it
    mythread.start();
else
    //it is running already compensate

Ответ 3

Если вы вызвали запуск на нем, и он запущен, вы получите IllegalThreadStateException. Ловить это один из способов узнать.

Другой вариант - расширить Thread и добавить логическое значение, в котором вы отслеживаете, был ли запущен ваш Thread. Вы можете переопределить метод начала Thread, чтобы проверить логическое значение до вызова super.start().

Вы должны быть очень осторожны при использовании потоков на Android. Убедитесь, что вы поняли жизненный цикл компонента, который его запускает. Кроме того, вы должны рассмотреть некоторые из вспомогательных классов, таких как Handler и AsyncTask, вместо того, чтобы создавать нерестовые потоки.