进程和线程
进程
- 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还要用到磁盘、网络等设备
- 当一个程序被运行,从磁盘加载这个程序代码到内存,就开启了一个进程
- 一个进程可以视为程序的一个实例
线程
- 一个进程可以分为一到多个线程
- 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU运行
- Java中,线程作为最小调度单位,进程作为资源分配的最小单位,在windows中进程是不活动的,知识作为线程的容器
线程和进程的对比
- 进程基本是相互独立的,线程存在于进程内,是进程的一个子集
- 进程拥有共享资源,入内存空间等,供其内部的线程共享
- 进程间通信较为复杂,同一计算机内的IPC通信、和不同计算机之间的网络通信;而线程的通信相对简单,因为他们共享进程内的内存
- 线程更轻量,线程上下文切换成本比进程上下文切换成本低
并行和并发
并发:同一个时间段,多个线程串行执行;是指同一时间应对多件事情的能力
并行:同一时刻,多个线程同时执行;是指同一时间动手做多件事情的能力
多线程典型应用
异步调用
同步:需要等待结果返回,才能继续运行就是同步
异步:不需要等待结果返回,就能继续运行就是异步
- 多线程可以让方法执行变为异步的,比如磁盘读取文件,假设读取操作花费5s,如果多线程,这5s调用者什么都做不了
- 比如在项目中,视频文件需要转换格式等比较费时的操作,这时开一个新线程处理视频转换,避免阻塞主线程
- tomcat中的异步servlet也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞tomcat的工作线程
- ui程序中,开线程进行其他的操作,避免阻塞ui线程导致用户操作界面卡死
提高效率
充分利用多核CPU(多个线程可以并行执行)的优势,提高运行效率,例如,执行三个计算:
- 计算1花费10ms
- 计算2花费11ms
- 计算3花费9ms
- 汇总花费1ms
如果串行执行,总花费时间是10+11+9+1=31ms
如果是并行执行,则可以同时执行计算1、2、3;总花费时间只有12ms
- 单核CPU下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu,不至于一个线程总占用cpu
- 多核cpu可以并行跑多个线程,但是能否提高程序效率还要取决于线程的任务目的是否相同,如果任务都互不影响,拆分是没有意义的
- IO操作不占用cpu,只是一般拷贝文件使用的是阻塞IO,此时相当于线程虽然不用cpu,但是需要一直等待IO结束,没有充分利用线程。所以有了非阻塞IO和异步IO优化