深入源码剖析Thread.join实现

来源:互联网 发布:淘宝12寸兵人 编辑:程序博客网 时间:2024/05/21 22:55

java.lang.Thread类提供一个静态方法join可以阻塞主线程(调用join方法的线程),直到当前线程执行完。用法如下:
这里写图片描述

join会保证t2在t1线程执行完退出之后再执行,程序执行结果总是如下
这里写图片描述

定义

这里写图片描述

实现

该方法掉用了join(0)方法, 我们跟进查看具体实现。注意这里是一个静态方法加了同步锁,锁的是this,也就是当前类实例。我们知道在线程获取了锁以后再执行wait方法,会让线程释放掉锁,并且进入到等待阻塞状态,线程被唤醒或等待一定时间之后以后获取锁后会重新从wait的地方往下执行。
作者巧用了这个原理,先获取锁再调用wait(0)释放锁并让主线程进入等待阻塞。并且循环执行,一旦主线程重新获取锁就立马释放。这样就保证了主线程一直得不到执行。
这里写图片描述

按照上诉代码,如果执行t.join(10 * 1000)那么主线程会阻塞10s,而事实并非如此,请看下面测试代码
这里写图片描述

输出如下
这里写图片描述

这说明t线程执行完,main线程就得到执行,并没有阻塞10s,也就是说main线程得到了唤醒。翻看JVM源码发现在线程结束的时候会调用lock.notify_all(thread)唤醒线程
这里写图片描述

总结

  1. java.lang.Thread.join方法通过循环阻塞主线程的方式保证当前线程优先执
  2. 当前线程执行完之后会立马唤醒主线程继续执行

文章参考:https://www.zhihu.com/question/44621343/answer/97640972

原创粉丝点击