线程相关概念

什么是线程/进程(Thread/Process)

  • 进程:进程是资源分配(CPU、内存)的基本单位,它是程序执行时的一个实例。
    程序运行时,系统就会创建一个进程,并为他分配资源,然后把该进程放入进程就绪队列。进程调度器选中该进程的时候为它分配CPU时间片,程序开始真正运行。
  • 线程:线程是程序执行时的最小单位,是进程的一个执行流,CPU调度和分派的基本单位。
    一个进程至少有一个线程,可以包含多个线程,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
    线程由CPU调度执行,在多CPU环境下就可以多线程同时运行,同样多线程也可以实现并发操作,为每个请求分配一个线程来处理。

线程和进程的区别、优劣

  • 进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 创建、销毁和切换:进程有独立的地址空间,新建一个进程之后,系统为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这些操作花销较大。线程间共享进程中的数据,使用相同的地址空间,因此CPU在线程间切换要比进程间切换花销小很多,同理创建、销毁一个线程的花销更小
  • 数据共享和通信:线程间通信更加方便,因为同一进程下的线程共享全局变量和静态变量等数据;进程间通信需要以通信的方式(IPC)进行。不过多线程要处理同步和互斥问题。
  • 健壮性:多进程更加健壮,一个进程死亡不会影响其他进程。在多线程程序中,由于共享进程中的数据,一个线程死亡会导致同一进程下其他线程死亡(整个进程死亡)。

线程的五个状态

新建 =>就绪 =>运行 =>阻塞 =>死亡

阻塞

  • 等待阻塞
  • 同步阻塞
  • 其他阻塞
    线程相关概念

状态之间的转移

新建的线程调用start()方法,进入就绪状态,此时线程并未运行;

该线程获取到CPU权限从就绪状态进入运行状态(线程只能从就绪状态进入运行状态);

运行状态的线程调用wait()方法进入等待阻塞状态

运行状态的线程试图获取锁,进入同步阻塞状态;等待阻塞的线程等到通知或者中断,进入同步阻塞状态

同步阻塞状态获取到同步锁,进入就绪状态

运行状态的线程调用sleep()、join()、suspend()方法、发出IO请求时,进入阻塞状态,sleep()超时、join()结束或超时、调用resume()方法、IO处理完毕,进入就绪状态

运行状态的线程运行结束或者出现异常,进入死亡状态