Skip to content
On this page
进程

正在执行的一个应用程序

线程

单位时间操作系统分配的cpu资源

一个应用程序包含多个线程

多线程

为了更好的利用cpu资源

在窗体应用中: 主线程负责UI的更新、其余线程负责一些网络、文件处理 对于用户来说不会体验到被卡死的感觉

在Web程序中: 多线程意味着你可以处理更多的请求

异步

为了避免线程操作阻塞的情况出现

如上述多线程中,假如这个进程中拥有10个线程

有100个用户发起了HTTP请求 这些请求会对读取文件(假设需要2S)的时间然后再返回

假设没有其他时间消耗

100个用户 在10个线程并发的情况下如下:

02468101214161820
第1-10位用户处理处理完成
第11-20位用户处理处理完成
第21-30位用户处理处理完成
第31-40位用户处理处理完成
第41-50位用户处理处理完成
第51-60位用户处理处理完成
第61-70位用户处理处理完成
第71-80位用户处理处理完成
第81-90位用户处理处理完成
第91-100位用户处理处理完成

这虽然用到了多线程 但是这里面资源依然有个巨大的浪费 读取文件时的这2S的时间

此时 这个线程是没事干的状态 但是被这一步给阻塞了...

怎么办?

遇到这种事的时候 留个标记,让线程先处理其他事,别闲着😢,读取好文件时,再随便通知一个线程,让它接着在处理

那么当第一个线程遇到阻塞时,里面去接待下一个用户,时间线类似这样:

00.010.020.030.04...
线程A处理第1位用户的请求处理没事干了,去处理其他事
线程A处理第11位用户的请求处理没事干了,去处理其他事
线程A处理第21位用户的请求处理没事干了,去处理其他事
线程A处理第31位用户的请求处理没事干了,去处理其他事
...

最终类似这样

00.010.020.030.040.050.060.070.080.092...2.09
第1-10位用户处理处理完成
第11-20位用户处理处理完成
第21-30位用户处理处理完成
第31-40位用户处理处理完成
第41-50位用户处理处理完成
第51-60位用户处理处理完成
第61-70位用户处理处理完成
第71-80位用户处理处理完成
第81-90位用户处理处理完成
第91-100位用户处理处理完成

你会发现 在之前的多线程中 第91-100位用户 可能在等待了18s后才开始被响应(转圈圈转了18s)

但是在异步操作中 第91-100位用户 可能在第0.09s时就已经得到了响应(几乎感知不出来)

这也就是为啥叫做异步编程可以避免线程不必要的阻塞 进而提升效率