| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> java多线程join()方法的作用和实现原理 -> 正文阅读 |
|
[Java知识库]java多线程join()方法的作用和实现原理 |
1、join() 方法的作用? ? 这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码; 2、应用场景比如有三个人小红、小李、小王, 三个人相约一起去酒店吃饭,菜已经点好了,?三个人从不同的地方出发,只有三个人都到了酒店之后才会开始上菜;那么这三个人就分别代表三个线程,这三个线程执行完之后才会执行 “上菜” 的代码逻辑, 代码示例
打印结果 3、坑点java的join方法中,这里有一个坑,就是下面这个方法
我们都知道 ,join方法的作用是阻塞,即等待线程结束,才继续执行。如果调用了Thread.currentThread().join(); 这个方法,那么线程一直在阻塞,无法终止。因为它自己在等待自己结束;这无疑会造成死锁; 接下来我们来测试一把,代码和上面的一样,只需要改一行代码即可,在上面的代码的Hotel.run()方法中,将 t3.join(); 改为 Thread.currentThread().join(); 即可;
运行后结果如下 所以这个方法一定不要直接使用; 4、join方法的实现原理? ? 说了这么多,也举了这么多例子了,join方法是怎么实现线程等待的呢?我点进去join方法内部可以看到,其实它的内部也就是调用了wait()方法, 只不过它多做了一步,用了一个循环来判断线程是否还活着,isAlive()方法就是用来判断线程是否还活着; 4.1、join方法实现原理的疑问那么这个时候肯定有的同学就有疑问了,只看到join()方法调用了wait()方法,但是没看到有调用notify() 或者 notifyAll() 系列的唤醒方法,那它是怎么唤醒的呢?如果不唤醒,那不就一直等待下去了吗? 原来啊,在java中,Thread类线程执行完run()方法后,一定会自动执行notifyAll()方法 ?这是notifyAll()非常重要的隐藏知识点,这个细节隐藏在Java的Native方法中,所以一般不会被人发现。我们观察C/C++源码,如下:
其中 完 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/18 15:11:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |