现实生活中经常能碰到“插队”的情况,同样,在 Thread 类中也提供了一个 join()方法来实现这个“功能”。当这个线程中调用**其他线程**的 join()方法时,**被调用的线程将被阻塞,直到_ join()_方法加入的线程执行完成后它才会继续运行**。接下来通过案例来演示 join()方法的使用,如下所示。
public class example09 {
public static void main(String[] args) throws Exception {
//创建线程
Thread t = new Thread(new EmergencyThread(), "线程一");
//开启线程
t.start();
for (int i = 0; i < 6; i++) {
System.out.println(Thread.currentThread().getName() + "输出:" + i);
if (i == 2) {
t.join(); //调用 join()方法
}
Thread.sleep(50); //线程休眠 50 毫秒
}
}
}
class EmergencyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 6; i++) {
System.out.println(Thread.currentThread().getName() + "输出:" + i);
try {
Thread.sleep(500); //线程休眠 500 毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果如下所示。
上述代码块中,在 main 线程中开启了一个线程一,两个线程的循环体中都调用了 Thread 的 sleep()方法,也实现了两个线程的交替执行。当 main 线程中的循环变量为 2 时,线程一调用了 join()方法,这时,线程一就会“插队”优先执行。从运行结果可以看出,当 main 线程输出 2 以后,直到线程一执行完毕,main 线程才继续执行。
需要注意的是,线程执行完毕时,并没有进入死亡状态,直到程序结束,或者强制结束线程,线程才会完全结束。