JAVA Thread之join()使用

概述

主线程 创建并启动 子线程后,默认父线程仍然继续执行 。

但有时我们并不想这样,而是:创建并启动子线程后,让父线程等待,等待 子线程死亡后,父线程才继续执行

A线程 等待 B线程 完成才继续执行,就用到join()函数。

线程阻塞:这种让线程等待,就叫 阻塞,也就是说A线程进入 阻塞状态

方法

方法1

等待这个线程死亡
底层调用join(long millis)

理解:备胎对女神说:我等你一辈子

public final void join() throws InterruptedException

方法2

最多等待 millis 毫秒,之后不管这个线程是否死亡,都不等待,继续执行
0的超时意味着永远等待。

理解:备胎对女神说:我等你10年

public final synchronized void join(long millis)
    throws InterruptedException

方法3

最多等待 millis 毫秒 nanos纳秒,之后不管这个线程是否死亡,都不等待,继续执行
底层调用join(long millis)

public final synchronized void join(long millis, int nanos)
    throws InterruptedException

例子

定义线程类:

public class MyThread extends Thread{
    //定义指定线程名称的构造方法
    public MyThread(String name) {
        //调用父类的String参数的构造方法,指定线程的名称
        super(name);
    }
    //在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
    @Override
    public void run() {
        for (int i = 0; i <2000 ; i++) {
            System.out.println(this.getName()+"-"+i);
        }
    }
}

定义测试类

public class ThreadTestMain4 {
    public static void main(String[] args) {
        MyThread mt=new MyThread("第1个线程");
        mt.start();
        try {
            mt.join(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //在主方法中执行for循环
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName()+"-"+i);
        }
    }
}

执行结果:
第1个线程 和 第2个线程交替执行,都执行完毕后,主线程再执行


原文出处:/show_1EF4sl9CO0Dc.html