假设目前有两个线程,线程A和线程B。
情景一:如果线程A正在运行,此时线程B调用join()方法时,线程B插队执行(线程B执行到死亡)后线程A再执行;
情景二:如果线程A正在运行,此时线程A调用join()方法时,线程A处于等待状态,如果调用的join()方法中没有传参数(等待多少毫秒),线程A将无限期等待下去,无论线程B是否执行结束。
情景一示例代码:
public class Thread1 extends Thread {
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"-"+i);
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.setName("子线程");//子线程设置线程名
t1.start();
//为主线程设置线程名
Thread.currentThread().setName("主线程");
for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"-"+i+"====");
if(i==5){//当前执行线程为主线程,当主线程执行到i==5时,子线程t1插队执行到线程死亡
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//判断自线程是否存活
System.out.println("子线程是否存活:"+t1.isAlive());
}
}
当前执行线程为主线程,当主线程执行到i==5时,子线程t1插队执行到线程死亡,然后主线程再执行到死亡
此时输出结果为:
情景二示例代码:
当前线程为主线程,主线程调用join()方法,则主线程处于等待状态,等待子线程执行结束,若join()方法中没有传参数-时长,则主线程将无限期等待下去,后面的代码不会执行
package com.yhzz.package3;
public class Thread1 extends Thread {
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"-"+i);
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.setName("子线程");//子线程设置线程名
t1.start();
//为主线程设置线程名
Thread.currentThread().setName("主线程");
for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"-"+i+"====");
if(i==5){//当前执行线程为主线程,当主线程执行到i==5时,主线程等待
try {
Thread.currentThread().join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//判断子线程是否存活
System.out.println("子线程是否存活:"+t1.isAlive());
//判断主线程是否存活
System.out.println("主线程是否存活:"+Thread.currentThread().isAlive());
}
}