在讨论这个问题之前,先学习一下时间片的概念。
时间片即CPU分配给各个程序的时间,每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。(百度百科)
多线程正是充分利用利用时间片,从而充分利用CPU的宝贵资源来提高执行效率。但是创建线程和销毁线程的开销都比较大,但线程数量太多时,性能会很差,因为操作系统需要在它们之间切换,消耗的内存也也很大。
在执行很多任务时,开辟更多线程对于性能提升没有太大意义,反而会降低效率。对于CPU密集型的操作,适当的使用多线程会提高cpu的利用率,从而提高性能。但是对于比如IO,网络,数据库连接,打印机等一些资源时,却几乎没有意义。因为瓶颈不在CPU,无论你怎么提高CPU的利用效率也没有任何意义。例如:
DMA的意思是直接内存访问,是一种不经过CPU而直接从内存了存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率。
在类似这种情况下,它们有自己的独特的处理方式,CPU只是下达开始指令和接收结束指令。此时我们选择异步处理方式就显得非常有意义。异步不会马上返回结果,等收到准备好的信号时我们开始处理我们真正要处理的逻辑,在等待过程中我们可以干很多其它事情。
所以大多数时候,当我们的操作是计算密集型时采用多线程,当我们的操作时IO密集型时使用异步。