深入源码剖析Thread.join实现

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)唤醒线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDGLF1X9-1585795949121)(https://img-blog.youkuaiyun.com/20171027231932359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenljOTIwNzE2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

总结

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值