概述
主线程 创建并启动 子线程后,默认父线程仍然继续执行 。
但有时我们并不想这样,而是:创建并启动子线程后,让父线程等待,等待 子线程死亡后,父线程才继续执行
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个线程交替执行,都执行完毕后,主线程再执行