单线程 多线程 同步 异步 阻塞 非阻塞 理解与总结 Better

单线程与多线程

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由一个或多个线程所组成的。

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等)。线程可以理解为进程中的执行的一段程序片段。

例如——某音频播放程序可以实现一边在显示歌词、一边在显示音频柱、一边在放歌。这就是一个程序下面有多个线程。
在单个程序中同时运行多个线程完成不同的工作,称为多线程,反之为单线程。
生活中的比喻:

单线程:一个人。扫地->做饭->洗衣服

多线程:三个人。A(扫地),B(做饭),C(洗衣服)

同步与异步(被调用者而言)、阻塞与非阻塞(调用者而言)

1、同步(sync):

发出一个功能调用时,在没有得到结果之前,该调用就不返回。

2、异步(async):

与同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。

对于通知调用者的三种方式,具体如下:

状态:即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。

通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。

回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。

3、阻塞(block):

阻塞调用是指调用结果返回(或者收到通知)之前,当前线程会被挂起,即不继续执行后续操作。

简单来说,等前一件做完了才能做下一件事。

4、非阻塞(non-block):

非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

总结:所以所谓同步异步,是对于被调用者而言的;而阻塞非阻塞,则是对调用者而言的。

和刚才一样,打个比喻加深理解:

1、同步阻塞:你打电话给114查路线,在不挂断的情况下,客服帮你查了十分钟之后告诉你,期间你一直在接听电话。

2、同步非阻塞:你打电话给114查路线,在不挂断的情况下,客服帮你查了十分钟之后告诉你,你期间吃了个(打电话没有影响你做其他事,显示运用中也很难遇到)。

3、异步非阻塞:你打电话给114查路线,客服说查好之后打给你,这期间你可以做任何事。

4、异步阻塞:你打电话给114查路线,客服说查好之后打给你,但这期间你什么都没做,等到回复电话之后,再继续下一步动作。(是不是很傻)现实运用中,异步阻塞是没有意义的!

链接:https://www.jianshu.com/p/19b3e729c8a8
链接:https://blog.csdn.net/wopelo/article/details/70141623
原文地址:https://www.cnblogs.com/huangtq/p/14503792.html