其他线程完成后,Java再次运行线程

时间:2018-04-06 09:29:44

标签: java

如何在其他线程完成后运行线程,假设我有3个java类(Cls1和Cls2实现了runnable,我使用sleep来知道哪些语句首先运行),这是我的代码:

public class Master {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        //loop1
        for(int i=1; i<=2; i++) {
            Cls1 c1 = new Cls1();
        }

        //Here i want to wait until the thread loop1 is finished, what to do?

        //loop2
        for(int j=1; j<=2; j++) {
            Cls2 c2 = new Cls2();
        }
    }
}

public class Cls1 implements Runnable{
    Thread myThread;
    Cls1() {
        myThread = new Thread(this, "");
        myThread.start();       
    }

    @Override
    public void run() {
        System.out.println("hello1");
        TimeUnit.SECONDS.sleep(3);
        System.out.println("hello2");
    }
}

public class Cls2 implements Runnable{
    Thread myThread;
    Cls2() {
        myThread = new Thread(this, "");
        myThread.start();
    }

    @Override
    public void run() {
        System.out.println("hello3");
        TimeUnit.SECONDS.sleep(3);
        System.out.println("hello4");
    }
}

这是输出我的代码: hello1 hello1 hello3 hello3 hello2 hello2 hello4 hello4

这是我期望的输出: hello1 hello1 hello2 hello2 hello3 hello3 hello4 hello4

我该怎么办?

3 个答案:

答案 0 :(得分:3)

如果您想等待线程完成,请调用join方法。

答案 1 :(得分:2)

你可以尝试类似的东西:

@SuppressWarnings("unused")
public static void main(String[] args) {
    Thread threads[] = new Thread[2];
    //loop1
    for(int i=1; i<=2; i++) {
        threads[i-1] = new Cls1();
    }

    for (Thread thread: threads) {
        thread.join();
    }

    //loop2
    for(int j=1; j<=2; j++) {
        Cls2 c2 = new Cls2();
    }
}

更新:使Cls1成为Thread的子类:

public class Cls1 extends Thread {
    Cls1() {
        start();       
    }

    @Override
    public void run() {
        System.out.println("hello1");
        TimeUnit.SECONDS.sleep(3);
        System.out.println("hello2");
    }
}

答案 2 :(得分:0)

要一个接一个地运行线程,需要同步它。 等,通知和notifyAll ..所有这些都可以使用。 如果你没有同步它,那么它不能保证你想要产生的输出顺序。

因此,我们必须采用一个变量“flag”并逐个同步线程,如下所示:

If value of flag=1, then it is class A's turn to print.

如果flag = 2的值,则轮到B级打印。 如果flag = 3的值,则轮到C级打印。