首先讲到join方法时则需要先看看下面这个执行结果:
可以发现的是线程1与线程而一直在争夺执行权,二者的执行顺序毫无逻辑可言,当时如果我是想实现让线程1先执行,其后线程2执行这该怎么实现呢?当然就是通过今天讲的join方法,该方法可以实现,先看看代码:
package com.juc.init.thread;
public class ThreadDemo5 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
int cnt = 0;
while (cnt < 10) {
System.out.println("线程1---" + cnt++);
}
});
Thread t2 = new Thread(() -> {
int cnt = 0;
while (cnt < 10) {
System.out.println("线程2---" + cnt++);
}
});
t1.start();
System.out.println("线程1状态"+t1.getState());
t1.join();
System.out.println("线程1状态"+t1.getState());
t2.start();
}
}
输出结果如下:
清晰的可见,线程1执行完成之后,状态已经是TERMINATED,线程2才开始执行。join方法还有两个个重载方法:
分别表示等待几毫秒和等待毫秒加上等待几纳秒执行后续的线程。
接下来看看join方法是怎么实现的,首先不管是无参的还是两个参数的最终调用的都是一个参数的方法那么我们Ctrl+B跟进源码:
首先映入眼帘的就是synchronized同步关键字,也就是调用了该同步方法后,该线程就霸占了cpu的执行权,导致其他线程将无法执行,主要原理找到了。其次是延迟释放锁,我们发现while条件中,当线程存活并且还有剩余延迟时间则会循环调用wait方法实现线程等待的过程。
那么本次的分享就到这里,如果有讲错的地方还请指正。