并发 - 如何启动一个线程,然后启动另一个线程,第一个线程在线程2运行时继续运行?

时间:2013-12-19 21:16:16

标签: java concurrency

我想首先启动日志,这将记录正在运行的步骤并花费很长时间。但是其他线程在日志完成之前不会启动。有什么技术可以解决我的问题吗? 实际上我已经阅读了一些关于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();

    }
}

2 个答案:

答案 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