现实生活中经常能碰到“插队”的情况,同样,在 Thread 类中也提供了一个 join()方法来实现这个“功能”。当这个线程中调用**其他线程**的 join()方法时,**调用的线程将被阻塞,直到_ join()_方法加入的线程执行完成后它才会继续运行**。接下来通过案例来演示 join()方法的使用,如下所示。

    1. public class example09 {
    2. public static void main(String[] args) throws Exception {
    3. //创建线程
    4. Thread t = new Thread(new EmergencyThread(), "线程一");
    5. //开启线程
    6. t.start();
    7. for (int i = 0; i < 6; i++) {
    8. System.out.println(Thread.currentThread().getName() + "输出:" + i);
    9. if (i == 2) {
    10. t.join(); //调用 join()方法
    11. }
    12. Thread.sleep(50); //线程休眠 50 毫秒
    13. }
    14. }
    15. }
    16. class EmergencyThread implements Runnable{
    17. @Override
    18. public void run() {
    19. for (int i = 0; i < 6; i++) {
    20. System.out.println(Thread.currentThread().getName() + "输出:" + i);
    21. try {
    22. Thread.sleep(500); //线程休眠 500 毫秒
    23. } catch (InterruptedException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. }
    28. }

    运行结果如下所示。
    QQ截图20200709195545.png
    上述代码块中,在 main 线程中开启了一个线程一,两个线程的循环体中都调用了 Thread 的 sleep()方法,也实现了两个线程的交替执行。当 main 线程中的循环变量为 2 时,线程一调用了 join()方法,这时,线程一就会“插队”优先执行。从运行结果可以看出,当 main 线程输出 2 以后,直到线程一执行完毕,main 线程才继续执行。

    需要注意的是,线程执行完毕时,并没有进入死亡状态,直到程序结束,或者强制结束线程,线程才会完全结束。