刚知道咋打开 IDEA,费劲扒拉的写个 HelloWorld,就要上手搞多线程绝对是史诗级理解难度。、、、,纳尼/p>
以我的学习经历来说,一个知识点是否能快速接受并学习到,往往是看有没有一个合适的场景和好的例子,来引导读者学习到这样的技术,就像;
- Git:上厕所不叫上厕所,叫拉分支!
- Socket:厕所就是服务器,坑就是端口!
- 队列:上厕所??叫入队列,先进先出!
- 栈:去厨房??叫进栈,后进先出!
- 架构:三居的格局叫MVC,四居的格局叫DDD!
- 理论:系统结构设计定的好,有点bug没问题,能改。这就是茅坑跟坐便的区别。
除了有点味道以外,这回是不记住了,我们编程写代码的过程和我们日常生活的例子,往往都是这样可以对应上,有了真实可以触及的实物,再去了解编程就会更加容易,也很难忘记。
二、给小师妹一个脸红的多线程
一个最开始接触多线程知识的未来500强工程师,也可能需要翻很多次书、写很多例子、敲很多代码,才能大概理解个7788,不是这知识有多难,主要是例子不好,不进脑子。
那么,接下来我们模拟鹿鼎记·丽春院,清倌喝茶吟诗聊风月日常。当有达官贵人来时,需要分配清倌给大老爷。中间会有一些等待、叫醒操作。只为让你更好的记住这样的案例,不要想歪喽。清倌人即是只卖艺欢场人,喊麦的。
1. wait & notify 等待和叫醒
案例代码
测试结果
- ,说看完例子就懂了!
- 首先这样的例子它贴近于电视剧、影视作品中经常出现的场景。把生活与技术结合后,你会发现原本不好理解的技术点就好理解了!
- wait 和 notify/nofityall,是一对方法,有一个等待,就会有一个叫醒,否则程序就夯在那不动了。关于这部分会使用到的 在之前小傅哥有深入的源码分析,讲到它是怎么加锁在对象头的,如果你忘记了可以翻翻看 《synchronized 解毒,剖析源码深度分析!》
- 了解了基础的例子,接下来在深入学习线程中的各项技术点,就比较容易在头脑中带着场景去验证和学习了。
2. yield
yield 方法让出CPU,但不一定,一定让出!。这种可能会用在一些同时启动的线程中,按照优先级保证重要线程的执行,也可以是其他一些特殊的业务场景(例如这个线程内容很耗时,又不那么重要,可以放在后面)。
为了验证这个方法,我们做一个例子:启动50个线程进行,每个线程都进行1000次的加和计算。其中10个线程会执行让出CPU操作。那么,如果让出CPU那10个线程的计算加和时间都比较长,说明确实在进行让出操作。
案例代码
private static volatile Map count = new ConcurrentHashMap();static class Y implements Runnable { private String name; private boolean isYield; public Y(String name, boolean isYield) {this.name = name;this.isYield = isYield; } @Override public void run() {long l = System.currentTimeMillis();for (int i = 0; i 来源:小傅哥
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!