什么是进程和线程 线程与进程的区别( 二 )


5. 多线程:多线程是程序设计的逻辑层概念 , 它是进程中并发运行的一段代码 。多线程可以实现线程间的切换执行 。
6. 异步:异步和同步是相对的 , 同步就是顺序执行 , 执行完一个再执行下一个 , 需要等待、协调运行 。异步就是彼此独立,在等待某事件的过程中继续做自己的事 , 不需要等待这一事件完成后再工作 。线程就是实现异步的一个方式 。异步是让调用方法的主线程不需要同步等待另一线程的完成 , 从而可以让主线程干其它的事情 。
异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段 。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情 。实现异步可以采用多线程技术或则交给另外的进程来处理 。
为了对以上概念的更好理解举一个简单例子 ,  假设我要做 烧开水 , 举杠铃100下 ,  洗衣服 3件事情 。
烧开水 这件事情 ,  我要做的事情为 ,  准备烧开水 1分钟 ,  等开水烧开 8 分钟 , 关掉烧水机 1分钟
举杠铃100下 我要做的事情为, 举杠铃100下 10分钟
洗衣服 我要做的事情为 ,  准备洗衣服 1分钟 ,  等开水烧开 5 分钟 , 关掉洗衣机 1分钟
单核情况下
同步的完成 , 我需要做的时间为 1+ 8 +1 + 10 + 1+ 5 +1 = 27 分
如果异步 , 就是在等的时候 , 我可以切换去做别的事情
准备烧开水(1) + 准备洗衣服(1) + 举50下杠铃 (5)分钟+ 关洗衣机 1分钟 + 举杠铃20下 (2)分钟+ 关烧水机 1分钟 + 举30下杠铃(3)分钟
1+1+5+1+2+1+3 =14 分钟
双核 异步 并行
核1 准备烧开水 1分钟+ 举杠铃50下(5)分钟+ 等待3分钟 + 关掉烧水机 1分钟
核2 准备洗衣服 1分钟+ 举杠铃50下(5)分钟+ 关掉洗衣机 1分钟 + 等待3分钟
其实只花了 1+5+3+1 = 10分钟
其中还有双核都等待了3分钟
双核 异步 非并行
核1 举杠铃100下(10)分钟
核2 准备烧开水 1分钟+ 准备洗衣服 1分钟+ 等待5 分钟+ + 关掉烧水机 1分钟 + 等待 1 分钟 + 关掉洗衣机 1分钟
其实只花了 1+5+3+1 = 10分钟
多线程的做法
单核下
线程1 准备烧开水 1分钟 ,  等开水烧开 8 分钟 , 关掉烧水机 1分钟
线程2 举杠铃100下 10分钟
线程3 准备洗衣服 1分钟 ,  等开水烧开 5 分钟 , 关掉洗衣机 1分钟
cpu 可能这么切换 最理想的切换方式
线程1 准备烧开水1 sleep 1 sleep 5 sleep 1 sleep 2 关开水 1分钟 exit
线程2 sleep 1 sleep 1 举杠铃50 5分钟 sleep 1 举杠铃20 2分钟 sleep1 举杠铃30下 3分钟
线程3 sleep 1 准备洗衣服1 分钟 sleep 5 关洗衣机1分钟 exit
最后使用了 14分钟 和异步是一样的 。
但是实际上是不一样的 , 因为线程不会按照我们设想的去跑 ,  如果线程2 举杠铃先跑 , 整个流程的速度就下来了 。
异步和同步的区别 ,  在io等待的时候 , 同步不会切走 , 浪费了时间 。
如果都是独占cpu 的业务 ,  比如举杠铃的业务 ,  在单核情况下 多线和单线 没有区别 。
多线程的好处 , 比较容易的实现了 异步切换的思想 ,  因为异步的程序很难写的 。多线程本身程还是以同步完成 , 但是应该说
比效率是比不上异步的 。而且多线很容易写 ,  相对效率也高 。
多核的好处 , 就是可以同时做事情 ,  这个和单核完全不一样的 。