在线程中调用其他线程的join方法
1.首先创建一个线程,在主线程中main中运行
public class Thread01 extends Thread {
@Override
public void run() {
try {
for (int i = 0; i <100 ; i++) {
Thread.sleep(50); //sleep 线程睡一会,再到既定时间醒来加入到就绪状态
System.out.println("线程1正在执行循环"+i+"次");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程1执行结束");
}
}
public class Demo02 {
public static void main(String[] args) {
Thread01 thread01=new Thread01();
//在主线程中,调用线程1的join方法,就是说thread01方法执行结束了
//main方法才能执行
//线程1要先start再join
thread01.start();
try {
thread01.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程结束");
}
}
运行结果:
结论1:当在一个线程中调用其他线程(线程A)的join方法,那么要求线程A执行完成后,才能执行当前线程
注意:要求先start方法再join方法才行,不能搞反
上述例子的基础上,在main方法中再调用线程2,不要join方法,线程2是否会对结果又影响?或者线程1调用join方法是否会对线程2有影响??
public class Demo03 {
public static void main(String[] args) {
Thread01 thread01=new Thread01();
Thread02 thread02=new Thread02();
thread01.start();
thread02.start(); //启动了线程2
try {
thread01.join(); //还是只调用了线程1的join方法
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程结束");
}
}
运行结果:
线程1在结束的时候,线程main再执行,线程2在线程1结束前和后都在执行,说明线程2和线程1没有关系,也和main方法没有关系,
join()传入参数:
public class Demo04 {
public static void main(String[] args) {
Thread01 thread01=new Thread01();
thread01.start();
try {
//join方法传入参数
//当前线程主线程main等待300毫秒后,两个线程变成并行执行
//如果不传参,相当于当前线程(主线程)无限制等待线程01执行完成后它才执行
thread01.join(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程结束");
}
}
运行结果:
当前线程主线程main等待300毫秒后,两个线程变成并行执行
如果不传参,相当于当前线程(主线程)无限制等待线程01执行完成后它才执行
join()和start()调用顺序问题
前面提到的需要先start方法,在调用join才有效果,因为start方法是线程开始运行,如果一个线程都没有开始运行,调用join方法是没有意义的
join()方法底层调用了wait方法