如何检查Android线程是否正在运行

问题描述 投票:0回答:4

有没有办法检查 Thread 对象是否已经调用了 start ?

我正在尝试这样做:

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

    rt.start();
}

如果线程尚未运行,它将在其中启动线程。

java android multithreading
4个回答
15
投票

假设

rt
Thread
,只需检查
rt.isAlive()

或者,只需在开始线程之前使用布尔标志并将其设置为 true 即可。

我实际上更喜欢布尔方法,因此主线程不可能启动另一个线程两次 - 在您的线程启动并运行之前可能会有短暂的延迟,并且如果您的主线程尝试在快速连续,可能会在

rt.isAlive()
上得到“假”阴性结果。


7
投票

我已经成功地使用了这种方法:

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

2
投票

如果你调用了它的start,并且它正在运行,你会得到一个

IllegalThreadStateException
。 抓住这一点是了解的一种方法。

另一个选择是扩展线程并添加一个布尔值,用于跟踪线程是否已启动。 您可以重写 Thread 的 start 方法来在调用

super.start()
之前检查布尔值。

在 Android 中使用线程时应该非常小心。 确保您了解启动它的组件的生命周期。 另外,您应该考虑一些辅助类,例如 Handler 和 AsyncTask,而不是直接生成线程。


0
投票

通过传递一个线程来调用该方法。它将每 500 毫秒检查一次线程是否处于活动状态,启动延迟为 500 毫秒(您可以使用自定义值)。我经常用这个方法。

void threadAliveChecker(final Thread thread) {
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (!thread.isAlive()) {
                       // do your work after thread finish

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // do the ui work here
                        }
                    });
                    timer.cancel();
                }else {
                      // do work when thread is running like show progress bar
                  }
            }
        }, 500, 500);  // first is delay, second is period
    }

示例:

Thread thread = new Thread(myRunnable);
thread.start();
threadIsAliveChecker(thread);

这个方法会让我们知道线程何时完成其工作。

© www.soinside.com 2019 - 2024. All rights reserved.