深入源码剖析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)唤醒线程
总结
- java.lang.Thread.join方法通过循环阻塞主线程的方式保证当前线程优先执
- 当前线程执行完之后会立马唤醒主线程继续执行
文章参考:https://www.zhihu.com/question/44621343/answer/97640972
阅读全文
0 0
- 深入源码剖析Thread.join实现
- Thread.join 源码
- java thread join 源码解析
- 深入源码剖析LruCache
- Retrofit 源码剖析-深入
- Retrofit 源码剖析-深入
- SparkContext源码深入剖析
- Java中Thread源码剖析
- 深入剖析Spring Web源码(四) - DispatcherServlet的实现
- Thread线程join方法源码分析
- 深入剖析Socket实现
- 深入剖析Socket实现
- 深入剖析Socket实现
- 深入剖析Socket实现
- Redis源码剖析和注释(二十四)--- Redis Sentinel实现(哨兵操作的深入剖析)
- 【Java深入】HashSet源码剖析
- 【Java深入】LinkedList源码剖析
- 【Java深入】ConcurrentHashMap源码剖析
- 三国大战Pwn2Own黑客大赛 360成为首支冠军团队
- 淘宝推出了“潮玩城”,想不到挖出一家这么潮的C轮硬件公司
- 腾讯安全带领中国战队斩获黑客大赛Pwn2Own首日冠军
- Pwn2Own战报:腾讯安全战队首破微软Edge浏览器
- 逗号表达式和逗号运算符
- 深入源码剖析Thread.join实现
- GoPro又裁员了,270名员工将离职
- SQL 数据定义赋值、输出
- 重载流插入和前置与后置自增运算符
- java-基础知识汇总
- MXnet代码实战之正则化
- 10.27(周五)
- 以一个实例说明 CMakeLists.txt 文件的编写
- POJ 2766 laserbox 模拟还有过不了的map+set