
Java高并发系列(读书笔记)——等待线程结束(join)和谦让(yield)
发布日期:2021-05-04 18:18:21
浏览次数:11
分类:技术文章
本文共 1516 字,大约阅读时间需要 5 分钟。
join
/** * 表示无限等待,它会一直阻塞当前线程,直到目标线程执行完毕. */ public final void join()throws InterruptedException /** * 如果超过给定时间目标线程还在执行,当前线程也会因为"等不及",而继续往下执行 * @param millis 最大等待时间 */ public final synchronized void join(long millis) throws InterruptedException
下面是JDK中join()方法实现的核心代码片段
while (isAlive()){ wait(0);}
该方法强调让调用线程在当前线程对象上进行等待。当线程执行完成后,被等待的线程会在退出前调用notifyAll()方法通知所有的等待线程继续执行。也行这样解释有点抽象了,下面用代码解释一下。
public class JoinMain { public volatile static int i = 0; public static class AddThread extends Thread{ @Override public void run() { for (i=0;i<10000000;i++){ } } } public static void main(String[] args) throws InterruptedException { AddThread at = new AddThread(); at.start(); at.join(); //at.join(20); System.out.println(i); }}
上面这个创建的线程很简单,就是循环10000000并且每次循环 i 都加一。在主函数中如果不调用at.join()方法等待AddThread线程,那么得到的 i 很可能是0或一个非常小的数。因为AddThread还没开始执行, i 的值就已经被输出了。相对应的,如果给join()传入的等待时间过小的话,同样也是会因为等待时间太小使 i 无法循环10000000。
举个例子,下课时老师布置了作业,但要求下节课上课时就要完成作业上交(假设作业很多的话),那毫无疑问肯定是完成不了或者只能完成一点,但如果老师说到时候(没有时间期限)写完后在上交,那肯定可以完成作业的。这里的话同学完成布置的作业就相当于上面代码中的AddThrea线程,老师上交作业没有期限完成了上交即可也就相当于给该线程调用join()方法。
Thread.yield()
定义如下
public static native void yield();
这是一个静态方法,一旦执行,它会使当前线程让出CPU。但要注意,让出CPU并不表示当前线程不执行,当前线程在让出CPU后,还会进行CPU资源的争夺,但是否能够再次别分配到就不一定了。
因此,对于Thread.yield()的调用就好像是说:"我已经完成了一些最重要的工作了,我可以休息一下,可以给其他线程一些工作机会"
如果你觉得当前线程不那么重要,或者优先级非常低,而且害怕它会占用太多的CPU资源,那么就可以在适当的时候调用该方法,给予其他重要线程更多的工作机会。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月25日 11时37分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
尚硅谷2019年Netty教程 零拷贝 ----目标netty---step2.10
2019-03-01
springboot多模块
2019-03-01
打开UltraEdit,提示文件可能不是DOS格式
2019-03-01
vue子组件传值到父组件$emit
2019-03-01
ajax面试题大全
2019-03-01
Event Loop详解
2019-03-01
css面试点总结一
2019-03-01
牛逼设置
2019-03-01
foxmail配置qq邮箱,ssl连接错误
2019-03-01
UltraEdit不产生bak 文件可能不是DOS格式
2019-03-01
Linux系统Web应用安全加固
2019-03-01
【互联网安全】业务安全及防护(数据风控)
2019-03-01
云计算-大数据-云安全高等教育改革示范教材
2019-03-01
网站建设:简单动态网站搭建
2019-03-01
基于房源的画像分析
2019-03-01
Web站点安全监控
2019-03-01
使用MaxCompute进行数据质量核查
2019-03-01
JavaScript 自学手册(文档教程)
2019-03-01
搭建入侵检测系统
2019-03-01
Java学习进阶—高级编程
2019-03-01