如何在其他线程完成后运行线程,假设我有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
我该怎么办?
答案 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级打印。