本文共 783 字,大约阅读时间需要 2 分钟。
以调用方角度来讲,如果需要等待结果返回,才能继续运行就是同步
不需要等待结果返回,就能继续运行就是异步
设计多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停…
比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程处理视频转换,避免阻塞主线程
tomcat 的异步 servlet 也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞 tomcat 的工作线程
ui 程序中,开线程进行其他操作,避免阻塞 ui 线程
充分利用多核 cpu 的优势,提高运行效率。想象下面的场景,执行 3 个计算,最后将计算结果汇总。
计算1 10ms计算2 11ms计算3 9ms汇总 1ms
串行执行,那么总共花费的时间是10 + 11 + 9 + 1 = 31ms
四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间只取决于最长的那个线程运行的时间,即11ms最后加上汇总时间只会花费12ms
多核 cpu 才能提高效率,单核仍然时是轮流执行,并发
单核 cpu 下,多线程不能实际提高程序运行效率,不同线程并发使用cpu。
多核 cpu 可以并行跑多个线程,但能否提高程序运行效率还是要分情况。有些任务,经过精心设计,将任务拆分,并行执行,可以提高运行效率。不是所有计算任务都能拆分,也不是所有任务都需要拆分。
IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化。
转载地址:http://xtlq.baihongyu.com/