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

14

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

我想实现这样的功能:

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

    rt.start();
}

如果线程尚未运行,则启动线程。

4个回答

15
假设 rt 是一个线程(Thread),只需检查 rt.isAlive()
或者,只需使用布尔标志,并在启动线程之前将其设置为 true。
我实际上更喜欢布尔方法,这样主线程就没有办法启动其他线程两次-可能会有一小段时间,直到您的线程正在运行,如果主线程尝试在快速连续的两次中启动线程,则可能会得到“false”否定结果于rt.isAlive()

isAlive 对我来说一直返回 false(我刚刚更新了我的答案以反映我的代码)。使用布尔值应该可以工作,因为我已经在使用一个布尔值来停止我的内部线程循环。谢谢帮忙! - wajiw
没错,这个可行。基本上我直到执行动作之前才初始化线程,然后在那之后检查我的内部线程布尔值。 - wajiw
很高兴听到它起作用了!我唯一想再强调的是,你需要注意启动线程和运行线程之间的延迟 - 如果你在线程的 run 方法中设置一个 bool 值,有一个短暂的时间段,在这个时间段内你已经启动了线程,但 bool 值还没有被设置为 true。这就是为什么我建议在主线程中设置它的原因。 - EboMike
1
EboMike:你是否确实看到isAlive()返回false?从爱克莱尔开始,isAlive()函数只返回“vmThread!= null”,并且在调用pthread_create之前VM会设置vmThread字段。如果主线程调用start(),则主线程的任何后续isAlive()调用都将返回true。线程创建不是异步的。(在甜甜圈及更早版本中,isAlive()的工作方式不同,但仍应在调用create()后可靠地返回“true”)。 - fadden
1
太好了!好久不见了!我自己从未使用过isAlive(),只是浏览了文档,看起来这个方法可以解决这里的问题。顺便说一句 - 很高兴知道线程同步不是异步的(尽管公平地说,可能仍然没有定义线程的run()方法的第一条指令执行需要多长时间)。 - EboMike
你不知道线程启动需要多长时间,一旦线程启动,你也不知道“旧”线程还是“新”线程会先执行。你只知道新线程将是“可运行”的。 - fadden

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
如果您在已经启动的线程上调用start()方法,会抛出IllegalThreadStateException异常。捕获该异常是一种方法来了解是否已经启动线程。
另一种方法是扩展Thread类并添加一个布尔值,以跟踪您的线程是否已经启动。您可以重写Thread的start()方法,在调用super.start()之前检查布尔值。
但请注意,在Android中使用线程时要非常小心。确保您理解启动它的组件的生命周期。此外,您应该考虑一些辅助类,如Handler和AsyncTask,而不是直接生成线程。

有很多方法可以完成这个任务。我认为我们都同意,需要这样做是不可行的。 - Eric Levine
我只是想学习如何使用线程,这就是主要内容。我在一个单独的类中使用自己的线程实现,因此使用Runnable不起作用,但仅使用布尔方法应该可以。谢谢帮助! - wajiw
只是想让您知道,在Android中需要考虑环境。尽管线程的语法相同,但它与标准桌面Java非常不同。 - Eric Levine
这是我从文档中看到的。我的背景是C语言,我从未做过Java多线程。 :) - wajiw

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接