我想首先启动日志,这将记录正在运行的步骤并花费很长时间。但是其他线程在日志完成之前不会启动。有什么技术可以解决我的问题吗? 实际上我已经阅读了一些关于CyclicBarrier和CountDownLatch的示例代码。但我不确定应该使用哪个班级。
最后,我想出了它是如何工作的!
public boolean execute(ExecuteArguments args)
{
Thread logcat = new Thread(new LogCatsStart());
Thread runner = new Thread(new TestCaseStart());
logcat.start();
runner.start();
try
{
logcat.join();
runner.join();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
class LogCatsStart implements Runnable
{
@Override
public void run()
{
tag = String.format("%s_%s_%s_%s", Utilities.getCurrentTime("MM-dd_hh-mm-ss"),
testCaseName, "Iteration", iteration);
collectLogCat();
System.out.println("Done");
}
}
class TestCaseStart implements Runnable
{
@Override
public void run()
{
executeTest();
}
}
答案 0 :(得分:1)
从给出的描述中,我认为你可以在同一个线程中继续操作,如果第一个线程结束,则不需要启动第二个线程。
如果您不需要停止日志记录,则可以在两者之间共享CountDownLatch
,并在完成日志记录时在第一个线程中执行latch.countDown()
并在{0}处进行latch.await()
第二个帖子的开头。
答案 1 :(得分:1)
您可以使用CountDownLatch
。这是一个简单的例子,其中b线程等待一个线程:
import java.util.concurrent.CountDownLatch;
public class Example {
private static CountDownLatch cdl;
public static void main(String ... s){
cdl = new CountDownLatch(1);
Thread a = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("started a");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cdl.countDown();
System.out.println("stoped a");
}
});
Thread b = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("started b");
System.out.println("wait a");
try {
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("stoped b");
}
});
b.start();
a.start();
}
}
输出:
started b
wait a
started a
stoped a
stoped b