单线程与多线程
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由一个或多个线程所组成的。
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等)。线程可以理解为进程中的执行的一段程序片段。
例如——某音频播放程序可以实现一边在显示歌词、一边在显示音频柱、一边在放歌。这就是一个程序下面有多个线程。
在单个程序中同时运行多个线程完成不同的工作,称为多线程,反之为单线程。
生活中的比喻:
单线程:一个人。扫地->做饭->洗衣服
多线程:三个人。A(扫地),B(做饭),C(洗衣服)
同步与异步(被调用者而言)、阻塞与非阻塞(调用者而言)
1、同步(sync):
发出一个功能调用时,在没有得到结果之前,该调用就不返回。
2、异步(async):
与同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
对于通知调用者的三种方式,具体如下:
状态:即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。
通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。
3、阻塞(block):
阻塞调用是指调用结果返回(或者收到通知)之前,当前线程会被挂起,即不继续执行后续操作。
简单来说,等前一件做完了才能做下一件事。
4、非阻塞(non-block):
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
总结:所以所谓同步异步,是对于被调用者而言的;而阻塞非阻塞,则是对调用者而言的。
和刚才一样,打个比喻加深理解:
1、同步阻塞:你打电话给114查路线,在不挂断的情况下,客服帮你查了十分钟之后告诉你,期间你一直在接听电话。
2、同步非阻塞:你打电话给114查路线,在不挂断的情况下,客服帮你查了十分钟之后告诉你,你期间吃了个(打电话没有影响你做其他事,显示运用中也很难遇到)。
3、异步非阻塞:你打电话给114查路线,客服说查好之后打给你,这期间你可以做任何事。
4、异步阻塞:你打电话给114查路线,客服说查好之后打给你,但这期间你什么都没做,等到回复电话之后,再继续下一步动作。(是不是很傻)现实运用中,异步阻塞是没有意义的!