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

时间:2010-12-03 18:03:08

标签: java android multithreading

有没有办法检查Thread对象是否已经启动了它?

我正试图这样:

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

    rt.start();
}

如果线程尚未运行,它将启动该线程。

4 个答案:

答案 0 :(得分:15)

假设rtThread,请检查rt.isAlive()

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

我实际上更喜欢布尔方法,因此主线程无法启动另一个线程两次 - 可能会有一个短暂的延迟,直到你的线程启动并运行,如果你的主线程试图启动线程连续两次,它可能会在rt.isAlive()上得到“假”否定。

答案 1 :(得分:7)

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

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

答案 2 :(得分:2)

如果你打电话给它,它正在运行,你会得到IllegalThreadStateException。抓住这是一种了解的方法。

另一种选择是扩展Thread并添加一个布尔值,你可以跟踪你的Thread是否已经启动。您可以覆盖Thread的start方法以在调用super.start()之前检查布尔值。

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

答案 3 :(得分: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);

此方法将让我们知道线程何时完成其工作。