最近一段时间,着手Web后端开发,本着求真务实的精神,遂决定把多线程开发从头梳理一遍,以便日后翻查。
这头一节只是对基本概念的一个梳理,如果对它们比较了解的朋友,可以直接跳过哈。
说到这些个概念,就不得不提我们的CPU,它是整个计算机的核心,也就相当于人类的大脑。
如此一来,我们可以用现实生活中的情形来类比说明这几个概念:
1、并行和并发
并行:英文单词是parallel,意思是平行的。就好比操场跑道有多个赛道,可以同时有多名运动员进行比赛,而不会互相干扰。换做计算机,就是多个逻辑运算单元可以同时进行运算,以达到时间上的充分利用。那么这里有个前提就是多核,单核CPU就无法实现真正意义上的并行了。
并发:英文单词是concurrence,意思是同时发生。这种描述对时间上的要求就不是那么严格,是人为感知意义上的同时。比如你吃饭的时候打电话,你的嘴巴既需要咀嚼,又要说话,表面上你是在同时进行两件事,但实际上它们是交错进行的。于是,并发就可以理解为交错发生。
2、异步和同步
这两个概念很容易和日常说法混淆,比如我们说放电影,应当是音画同步进行的,但在计算机术语中这其实是“异步”,指两个线程同时执行任务,相互之间没有阻碍,一方发生阻塞另一方仍能进行。
比如放电影的过程中突然没有画面了,但是声音还是能继续播放的。
以上是对异步的概念解析,那什么是同步呢?
同步实际是顺序执行,可以是单线程,也可以是多线程。
单线程很好理解,因为我们的代码是顺序执行的,在同一线程中会执行完一个方法再执行下一个方法。
而多线程就没那么容易控制,谁先谁后执行我们无法预料,因此要想实现线程间同步,需要我们加以干涉,主动等待线程结束,再继续执行后面的方法。
这里的等待也分两种:一种是阻塞等待,一种是非阻塞等待。
阻塞等待就是等待过程不能做其他事情,如果是UI线程被阻塞,那么界面就会假死,无法进行任何操作;
非阻塞等待就是为了解决等待的过程还能正常进行其他的事情,比如我们界面点击保存需要一个较长时间的等待,如果一直阻塞在那里,则用户体验会很不好。用非阻塞的方式,可以让用户还能做些其他的不影响保存结果的事情,至少能让界面不出现假死现象,好让用户知道后台是在正常运行的。