【问题标题】:How to check if an Android Thread is running如何检查 Android 线程是否正在运行
【发布时间】:2011-05-19 21:44:02
【问题描述】:

有没有办法检查一个 Thread 对象是否已经开始调用它?

我正在尝试这样的事情:

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

    rt.start();
}

如果它还没有运行,它将在哪里启动线程。

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    假设rtThread,只需检查rt.isAlive()

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

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

    【讨论】:

    • isAlive 以某种方式不断为我返回 false(我刚刚更新了答案以反映我的代码。)使用布尔值应该可以工作,因为我已经在使用一个来停止我的内部线程循环。感谢您的帮助!
    • 是的,有效。基本上我不会在动作被触发之前初始化线程,然后我会检查我的内部线程布尔值。
    • 很高兴听到它成功了!我要重申的唯一一件事是,您需要注意启动线程和让它运行之间的延迟 - 如果您在线程的 run 方法中设置布尔值,那么您启动线程的时间很短,但 bool 尚未设置为 true。这就是为什么我建议在主线程中设置它。
    • EboMike:你真的看到 isAlive() 返回 false 吗?从 Eclair 开始,isAlive() 函数只返回“vmThread != null”,并且 vmThread 字段由 VM 在调用 pthread_create 之前设置。如果主线程调用 start(),则任何后续来自主线程的 isAlive() 调用都将返回 true。线程创建不是异步的。 (在 donut 和更早的版本中,isAlive() 的工作方式不同,但在调用 create() 后仍应可靠地返回“true”。)
    • 流行了!好久不见!我自己从未使用过 isAlive() ,我只是浏览了文档,这似乎可以解决问题。顺便说一句 - 很高兴知道线程同步不是异步的(尽管公平地说,大概还没有定义在线程的 run() 方法的第一条指令执行之前需要多长时间)。
    【解决方案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】:

      如果你在它上面调用了 start 并且它正在运行,你会得到一个IllegalThreadStateException。抓住这是一种了解方式。

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

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

      【讨论】:

      • 有很多方法可以做到这一点。我想我们都同意需要这样做并不能通过嗅探测试。
      • 我只是想学习如何使用线程,这主要是关于这个的。我在一个单独的类中使用我自己的 Thread 实现,因此使用 Runnable 不起作用,但布尔方法本身应该。感谢您的帮助!
      • 只是想让您意识到您需要考虑 Android 中的环境。它与标准桌面 Java 非常不同,尽管线程的语法是相同的。
      • 这就是我从文档中看到的。我的背景是c。我从来没有做过Java线程。 :)
      【解决方案4】:

      通过传递线程调用此方法。它将每 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);
      

      这个方法会告诉我们线程什么时候完成它的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        相关资源
        最近更新 更多