如何在java中等待线程的启动

时间:2011-04-24 14:51:58

标签: java android multithreading

我目前在Android仪器测试中遇到了一个小小的竞争条件。我想要的是:

  1. T1:启动线程T2
  2. T2:做点什么
  3. T1:加入T2
  4. 第1步和第3步是Android直播周期事件。但是因为在仪器测试中一切都发生得非常快我得到了:

    1. T1:启动线程T2
    2. T1:加入T2(结果是无操作)
    3. T2:做点什么
    4. 当然,我可以添加一些睡眠以获得所需的行为,但我想知道是否有更好的方法来做到这一点。即有没有办法确保刚刚start () -d的线程确实启动并且仍然没有等待启动的某个调度队列。

      (安迪小伙,我想念Ada基于会面的多任务处理)

      回答mat的问题:

        if (this.thread != null && this.thread.isAlive ())
        {
           this.stop.set (true);
      
           try
           {
              this.thread.join (1000);
           }
           catch (final InterruptedException Exception)
           {
              android.util.Log.w (Actor.TAG, "Thread did not want to join.", Exception);
           } // try
        } // if
      

      正如我所说:no-op因为线程还没有开始。

2 个答案:

答案 0 :(得分:12)

我通常使用CountDownLatch例如有关测试异步进程的信息,请参阅此answer

如果要同步许多线程的开头,您还可以使用CyclicBarrier

答案 1 :(得分:0)

Martin,看看你的代码我觉得你可能没有按照设计使用的方式使用Thread类。特别是,测试其他线程是否存活似乎是一种反模式。在大多数实际情况中,您可以省略代码中的this.thread.isAlive ()条件,程序仍然有效。

您似乎正在尝试使两个线程(应该执行两个不同的操作)运行相同的代码,并使用逻辑条件(例如this.thread != null)来决定两个线程中的哪一个目前正在运行。

通常,您将编写两个类,每个类扩展Thread并实现run()方法。每个run()方法都实现了单个线程的逻辑。然后你从第一个线程启动第二个线程,并在第二个线程上调用join()以等待它完成。

public class SecondThread extends Thread {
  public void run() {
    ...
  }      
}

public class FirstThread extends Thread {
  public void run() {
    // Only FirstThread is running
    ...

    SecondThread st = new SecondThread();
    st.start();

    // Now both threads are running
    ...

    st.join(); // Wait for SecondThread to complete

    // Only FirstThread is running
    ...

  }                
}