CPU是海王?聊聊 主/子线程 和 同/异步 的关系
最近表弟一直在找实习,经常会问我一些问题,有些问题在没有经历过真实工作时是真的不好理解的,所以我开了这个【表弟专栏】,专门为找工作的表弟解决一些疑惑。
这篇文章从计算机发展的角度出发,描述为什么计算机需要划分 "主/子线程" 和 "同/异步",希望这个故事你能喜欢。
开天辟地,计算机"老计"诞生
话说几十年前,老计(初代CPU)诞生了,老计诞生初期帮人们解决了诸多繁琐的计算工作,他可以无休无止地按照人们给的指令进行运算。

就像图中一样,人们产生着各种问题,然后把问题丢入到一个队列中去,老计按照人们丢入的指令按顺序进行计算。
但就像现在互联网越来越卷一样,老计工作几年之后,发现要做的事情实在是太多了,有些计算要算完要搞到几十年后了,这可咋办呢?
这时人们认为老计该退休了,换了大计出场,大计的优点是相当卷,计算速度是老计的N倍,大大提升了计算的速度。
现实问题,大计海王进化(主/子线程)
大计有一天在诚诚恳恳工作时,被主管拉到了办公室,开始批评大计:
"大计啊,我知道你工作起来很努力,但你有点死板了啊,所有人给你分配的工作你都是按顺序操作,导致用户说我们的产品就像在挤牙膏,一点点挤出来。你能再加快工作速度吗?不能只靠加班来完成工作啊!"

大计一脸mmp像,心想:“我特么要做什么,不还是你给到的指令啊”,但大计有着当代互联网人共同的目标("保住这份工"),所以大计也只能说:
"好的主管,这事我想想办法,明天给你个答复。"
大计这天工作到凌晨3点,下班后和总线一起去喝酒,说起了白天被主管叼这件事,总线说:
"这事好办啊,我平时给你传的各种指令,优先级不高的你让它不要走同一条路径传输呀,我们像渣男一样搞个高并发!给每个指令都送去温暖,钓住她们,让她们以为你是专一的男人,实际上你在同时和多人交往。"
大计一听直呼妙计妙计,总线不愧是和各个部门打交道的社交花,把泡妞能力用到工作上直接无缝衔接。
之前大计只有一条指令流水线时,他是按走流程,指令1处理完了,才处理指令2,是一个对指令专一的男子。
大计当即画出了这样的指令图:

大计现在能"同时"处理 3条指令:M_0、A_0和B_0,说是"同时",实际上只是大计在这三条指令里频繁切换,M_0完成40%,就去招呼下A_0,A_0处理完80%后,然后再去招呼下B_0指令。
也就是说虽然工作时长是一定的,但给主管一种同时在处理3个指令的错觉。就靠着这套海王策略,大计终于完成了刁钻主管的需求。
不急的话,这事可以等等再做(同/异步)
随着大计海王能力的扩展,现在最高时可以"同时"和几百个指令妹子约会,已经是不可被替代的重要角色,现在主管每天看到大计都得磕个头,大计的话语权也越来越大,甚至开始反过来给主管提需求了:
"主管啊,你可要知道我主线程是负责和用户交互的重要线程啊,你每天在主线程丢那么指令,非常影响用户的体验了啊"
"你有些渲染UI的逻辑太频繁了,导致我做了很多无用的渲染,而且渲染逻辑也分重要程度啊,不重要的指令你等我空闲了再处理啊"
主管连连点头,说好的好的:"我们下次添加指令时,会告诉你这个指令是否需要立刻实施,如果不那么重要可以等你空闲下来再处理。"
于是乎,同步、异步 的概念诞生了:

之前大计在处理 主线程 里的指令时,因为同一个线程指令是没有优先级的概念的,所以 线程里的指令还是按顺序处理的:M_0 -> M_1 -> M_2 -> M_3 -> M_4
但有了 异步 的概念后,假设这里的 指令M_1 不那么重要,那么大计在处理时是可以把 M_1 放到后面处理的:M_0 -> M_2 -> M_3 -> M_4 -> M_1
小结
本篇【表弟专栏】给大家聊了 主/子线程 诞生的必要性,描述了CPU海王本质,以及和同/异步的区别和关联。关于 主/子线程 和 同/异步 的问题,大家可以在评论区一起讨论。最后如果大家喜欢这个专题,可以关注我的公众号:冰以东,会持续更新【表弟专栏】,希望能帮忙大家找到更好的工作。
CPU是海王?聊聊 主/子线程 和 同/异步 的关系的更多相关文章
- Android中使用Thread线程与AsyncTask异步任务的区别
最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样? ...
- GUI(主)线程与子线程之间的通信(用信号槽通讯)
在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. 程序截图: 上代码: #include <QtGui> #inc ...
- QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽
在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. 程序截图: 上代码: #include <QtGui> #inc ...
- 2017-11-29 由runnable说起Android中的子线程和主线程
1.首先纠正一个观点,就是runnable运行在子线程中是错误的观念.runnable只是创建了一个执行任务的对象,但是它本身并不会创建一个新的子线程,Runable只是给你接口让你实现工作线程的工作 ...
- Python开发【笔记】:关于子线程(子进程)与主线程(主进程)的关联
前言: 主要分析下面的问题: 主线程启线程 主线程执行完毕,会关闭子线程吗? 子线程启线程 主线程执行完毕,会结束吗? 主进程启动进程,主进程执行完毕,会怎样? 子进程启动进程,进程执行完毕,又会 ...
- c# 子线程如何通知主线程,个人总结
我要实现的功能如下:程序中有2个线程,主线程和子线程,主线程中有一个变量:X主线程运行中激活子线程,子线程会做出计算改变 X 的值,主线程继续做其它的事,直到 X 的值发生改变时,才会响应,并在tex ...
- C#多线程应用:子线程更新主窗体控件的值(二)
在上篇文章中,我已经给大家列了一个在主线程中实现的方式,这篇文章来给大家说说使用Invoke的方式的例子: 对于不代理不太熟悉的朋友,建议先查查相关资料: 例子一: 在C#中,直接在子线程中对窗体上的 ...
- C#多线程应用:子线程更新主窗体控件的值(一)
我记得以前写过一次关于多线程的调用及更新的文章,由于时间比较久了,现在一时没找到.在做项目的时候,用到了多线程,还是有很多的同事在问多线程更新主窗体的事情,现在就这个事情做个记录. 说起多线程之间的更 ...
- [转]MFC子线程更改图像数据后更新主窗口图像显示方法
程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...
随机推荐
- 在Excel VBA中使用SQL到底优势在哪儿
小爬在之前的博文中多次提到,可以在VBA中写SQL来操作Excel文件,实现各类数据处理和分析需求.那么,你可能有这样的疑问:Excel原生的VBA,数据透视表,数据分析功能不够吗,为啥一定要用SQL ...
- 简单RSA攻击方式
RSA攻击方式总结 1.模数分解 1).解题思路 a).找到RSA算法中的公钥(e,n) b).通过n来找到对应的p和q,然后求得φ(n) c).通过gmpy2.invert或者gmpy2 ...
- 快速搭建springboot工程
一.创建SpringBoot的三种方式 在线创建: https://start.spring.io 在IntelliJ IDEA中选择Spring Initializr创建:或者在Eclipse中选择 ...
- 《PHP程序员面试笔试宝典》——如何回答技术性的问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中,面试官会经常询问一些技术性的问题,有的问题可能比较简单,都是历年的面试.笔试真题,求职者在平时的复习中会经 ...
- Solution -「Ynoi 2018」「洛谷 P4117」五彩斑斓的世界
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),处理 \(m\) 次操作: 给定 \(l,r,x\),把 \([l,r]\) 内所有 \(&g ...
- Note -「最大团-最小度不等式」
这是什么奇怪的名字qwq. 一些定义 只为便于理解,没有苛求专业的定义. 简单无向图:不存在重边.自环的无向图. \(\delta(G)\):无向图 \(G\) 中结点的最小度数.即 \(\m ...
- MySQL架构原理之运行机制
所谓运行机制即MySQL内部就如生产车间如何进行生产的.如下图: 1.建立连接,通过客户端/服务器通信协议与MySQL建立连接.MySQL客户端与服务端的通信方式是"半双工".对于 ...
- 科普IIS是什么?IIS介绍!
1.Microsoft IIS 是允许在公共Intranet或Internet上发布信息的Web服务器.Internet Information Server通过运用超文本传输协议(HTTP)传输信息 ...
- java实现 TCP通信
//服务端import com.hl.bluetooth.util.CRC16; import com.hl.bluetooth.util.FrameCheckFailedException; imp ...
- IDEA tomcat启动报错----Artifact is being deployed, please wait...解决
今天学习遇到了这个错误,记录下自己遇到的错误和解决方法! 这个报错的意思是: Artifact 正在部署中,请稍候- 实际上有可能就是jar包没有导进去.检查项目打包情况:file-->Proj ...