多线程:等待主线程中的另一个线程

时间:2014-03-25 14:04:13

标签: java multithreading concurrency

我有三个功能funcOne()funcTwo()& funcThree()在主线程中逐个调用:

public static void main(String[] args) {
    funcOne();
    funcTwo();
    funcThree();
}

我希望这三个函数按上述顺序运行。 funcOne()和funcThree()很好,因为它们在主线程上运行。对于funcTwo(),它的任务是在另一个线程中运行:

public static void funcTwo(){
   Thread thread = new Thread(){

        @Override
    public void run(){
           System.out.println("function two is running.");
        }
   }
   thread.start();
}

当我运行main函数时,我看到funcTwo()funcThree()之后运行。如何确保funcTwo()funcOne()之间运行? &安培; funcThree()

5 个答案:

答案 0 :(得分:1)

你可以试试这个:

public static void main(String[] args) {
    funcOne();
    funcTwo();
    funcThree();
}

public static void funcOne() {
    System.out.println("function one ran");
}

public static void funcTwo(){
    Thread thread = new Thread(){
         @Override public void run(){
            System.out.println("function two ran.");
         }
    };
    thread.start();
    try { thread.join(); } catch (InterruptedException e) {}
 }    

private static void funcThree() {
    System.out.println("function three ran");
}

答案 1 :(得分:1)

funcOne();
Thread thread = funcTwo();
thread.Join();
funcThree();

这将按顺序执行线程,当你调用thread.join()时,它会等待线程完成,虽然这会在你完成时冻结你的GUI或任何其他进程,如果线程需要一些时间。

线程做什么?

答案 2 :(得分:1)

使用Countdownlatch:

public class MyTestClass {
    static final CountDownLatch latch = new CountDownLatch(1);
    public static void main(String[] args) {

        funcOne();
        funcTwo();
        try { latch.await(); } catch (InterruptedException e) {}
        funcThree();
    }

    public static void funcOne() {
        System.out.println("function one ran");
    }

    public static void funcTwo(){
        Thread thread = new Thread(){
            @Override public void run(){
                System.out.println("function two ran.");
                latch.countDown();
            }
        };
        thread.start();
    }

    private static void funcThree() {
        System.out.println("function three ran");
    }
}

答案 3 :(得分:0)

我不知道你想做什么,但我认为,这是你问题的答案。

public static Thread funcTwo(){
   Thread thread = new Thread(){

        @Override
    public void run(){
           System.out.println("function two is running.");
        }
   }
   thread.start();
   return thread;
}

funcOne();
Thread thread = funcTwo();
thread.Join();
funcThree();

答案 4 :(得分:0)

从funcTwo返回创建的线程对象,并在funcThree之后使用thread.join()

如果您有多个线程,请使用CountDownLatch。