我目前在Android仪器测试中遇到了一个小小的竞争条件。我想要的是:
第1步和第3步是Android直播周期事件。但是因为在仪器测试中一切都发生得非常快我得到了:
当然,我可以添加一些睡眠以获得所需的行为,但我想知道是否有更好的方法来做到这一点。即有没有办法确保刚刚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因为线程还没有开始。
答案 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
...
}
}