如果对并发编程状态不是很了解的同学,我们可以回想一下操作系统原理关于进程的生命周期的学习,学习操作系统原理的同学都知道,进程也有自己的生命周期,进程可大致分为三种状态,以及三种状态之间的转变, 👉 操作系统—进程。

三种状态

  • 执行态:CPU正在运行的状态
  • 就绪态:一旦获得CPU就可以运行的状态。一句话总结;完事具备,只欠东风(CPU)
  • 阻塞态:进程等待资源或某个事件的发生而暂停的状态。

状态间转换

  • 阻塞态 👉 就绪态(唤醒过程)
  • 执行态 👉 就绪态(因为是分时操作,当时间片用完,执行态回到就绪态等在再次执行)
  • 执行态 👉 阻塞态(阻塞过程:运行中申请资源,不宜让CPU等待)

java 进程名 麒麟jni 修改进程名_休眠状态


线程也同样如此,大致分为五种状态,分别是 初始状态,可运行状态,运行状态,休眠状态,终止状态。

java 进程名 麒麟jni 修改进程名_休眠状态_02

NEW)(初始状态)

一个 Thread 对象被创建,此时还不被允许分配CPU,该状态仅仅表示 Thread 对象被创建出来了,但此时 Thread 对象和其它 Java 对象没有什么不同,仅仅是存在于内存之中,该对象的创建只是在编程语言方面的创建,一个真正的线程创建时调用该线程的 start() 方法。

the Java Virtual Machine calls the run method of this thread

java 进程名 麒麟jni 修改进程名_操作系统原理_03

MyThread t= new MyThread();
// 调用 从 NEW 状态转换到 RUNNABLE 状态
t.start();

RUNNABLE(可运行状态)

指的是线程可以分配 CPU 执行。在这种状态下,真正的操作系统线程已经被成功创建了,所以可以分配 CPU 执行。终于进入了可以使用CPU 的队列,相当于 OS 进程当中的就绪态。(万事具备,只欠东风)

RUNNABLE 进入 RUNNING 。 CPU 调度时,线程获得CPU,变为 RUNNING。

RUNNABLE 进入 BLOCKED。只有一种场景会触发这种转换,就是线程等待 synchronized 的隐式锁。synchronized 修饰的方法、代码块同一时刻只允许一个线程执行,其他线程只能等待,这种情况下,等待的线程就会从 RUNNABLE 转换到 BLOCKED 状态。而当等待的线程获得 synchronized 隐式锁时,就又会从 BLOCKED 转换到 RUNNABLE 状态。

java 进程名 麒麟jni 修改进程名_生命周期_04

RUNNING (运行状态)

CPU 调度时,线程获得空闲 CPU,变为 RUNNING,此时才会真正的运行 run() 的业务逻辑。
RUNNING 正常结束,或者JVM意外终止,调用stop() , 调用 interrupt()、或者程序运行异常,进入 TERMINATED。RUNNING 调用wait() ,sleep() ,suspend() 方法,进入 BLOCKED 此时进入阻塞队列RUNNING 时间片结束,发生线程切换,或者调用了 yield() 让出对CPU的执行权,进入RUNNABLE

BLOCKED (阻塞状态)

运行状态的线程如果调用一个阻塞的 API(例如以阻塞方式读文件)或者等待某个事件(例如条件变量),那么线程的状态就会转换到休眠状态,同时释放 CPU 使用权,休眠状态的线程永远没有机会获得 CPU 使用权。当等待的事件出现了,线程就会从休眠状态转换到可运行状态。
BLOCKED 只能转化为 RUNNABLE 状态 ,其他线程调用 notify() 或 notifyAll() ,则会唤醒阻塞态此案城,回到 RUNNABLE 状态

TERMINATED (终止状态)

线程正常结束或者出现异常就会进入终止状态,终止状态的线程不会切换到其他任何状态,进入终止状态也就意味着线程的生命周期结束了。

关于线程的生命周期,以及各个状态之间的转变你知道了么?上面我们介绍的是线程的通用五种状态,其实在 java 中,线程共有六种状态。

  • NEW(初始化状态)
  • RUNNABLE(可运行 / 运行状态)
  • BLOCKED(阻塞状态)
  • WAITING(无时限等待)
  • TIMED_WAITING(有时限等待)
  • TERMINATED(终止状态)

RUNNABLE 和 RUNNABLE 成为同一个状态。
BLOCKED、WAITING、TIMED_WAITING 是一种状态,即休眠态(BLOCKED)。

如果通过上述简化,我们可以大致分为四种状态(初始化状态,可运行状态,休眠状态,终止状态)

java 进程名 麒麟jni 修改进程名_操作系统原理_05


万物皆有定数,生老病死,线程也逃不掉!