进程与线程

进程

  • 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。进程就是用来加载所运行的程序的指令、管理内存、管理IO的(与操作系统区别)
  • 当一个程序被运行时,从磁盘加载这个程序的代码至内存,这就开启了一个进程
  • 进程就是可以视为程序的一个实例。大部分程序可以同时运行多个实例进程

线程

  • 一个进程之内可以分为一到多个线程
  • 一个线程就是一个指令流,将指令流中的一条条指令以一定顺序交给CPU执行
  • Java中,线程作为最小调度单位,进程作为资源分配的最小单位Windows中进程只是线程的容器

二者区别

  • 进程基本上是相互独立的,线程存在于进程内, 是进程的一个字集
  • 拥有共享的资源,如内存空间等,供内部的线程共享
  • 进程间通信较为复杂
    • 同一台计算机的进程通信成为IPC
    • 不同计算机间的通信需要通过网络,如HTTP协议
  • 线程通信相对简单,因为他们共享进程内的内存,多个线程可以访问同一个共享变量
  • 线程更轻量,线程上下文切换成本一般要比进程上下文切换低

并行与并发

单核CPU下,线程实际还是串行执行的操作系统中通过时间片轮转来实现线程在宏观状态下的同时执行

微观串行,宏观并行

这种执行方式也可称为并发执行

线程在不同的CPU核心上同时执行,叫做并行执行

  • 并发(Concurrent):同一时间应对多件事情的能力
  • 并行(Paraller):同一时间多件事情的能力

同步和异步

  • 同步方法:需要等待结果返回的方法
  • 异步方法:不需要等待结果返回的方法

例1:

public static void main(String[] args){
  FileReader.read();
  log.debug("读取完毕")
}

上例中只有文件读取完毕才会执行下一条语句,此为同步执行

例2:

public static void main(String[] args){
  new Thread(() -> FileReader.read());
  log.debug("读取完毕");
}

上例中文件读取使用了单独的线程,因此不需要等待文件读取完毕即可输出语句,此为异步执行

合理的使用同步和异步方式能够显著提高程序运行效率