Java线程状态转换

来自:Java线程状态和生命周期UML协议状态机图示例

这是一个UML 协议状态机图的例子, 显示了Java™中的Thread类的线程状态线程生命周期

Java中的线程是一个操作系统的轻量级进程,是计划执行的最小单位。

线程状态是JVM向Java程序报告的Java虚拟机(JVM)状态,它不反映任何操作系统(OS)线程状态。

在任何给定的时间点,Java 5Java 9中的Thread类的实例 可能处于以下线程状态之一:

  • New,
  • Runnable,
  • Timed waiting,
  • Waiting,
  • Blocked,
  • Terminated.

协议状态机示例 -  Java中的线程状态和生命周期。

New: 是已创建但尚未启动的线程的线程状态。

Runnable: 处于Runnable状态的线程正在从JVM的角度执行,但实际上它可能正在等待来自操作系统的某些资源,例如处理器。这种状态可以被认为是一个有两个子状态的复合状态。当线程转换到Runnable状态时,线程首先进入Ready子状态。线程调度决定线程何时可以实际启动Running。Thread.yield()显式推荐线程调度程序暂停当前正在执行的线程以允许其他线程执行。如果线程已经启动并且尚未死亡,线程仍处于活动状态

Timed waiting: 定时等待是等待指定时间的线程状态。线程运行时调用以下方法之一,线程将移至定时等待状态:

  • Thread.sleep(sleeptime)
  • Object.wait(timeout)
  • Thread.join(timeout)
  • LockSupport.parkNanos(timeout)
  • LockSupport.parkUntil(timeout)

Waiting:在没有指定timeout的情况下调用以下方法之一后, 线程将转到waiting等待状态:

  • Object.wait()
  • Thread.join()
  • LockSupport.park()

请注意,处于等待状态的线程无限期等待另一个线程提供等待线程所需的内容。一旦完成,其他线程就可以在线程共享的对象上调用Object.notify()或Object.notifyAll()。

已调用Thread.join()的线程正在等待指定的线程终止。这意味着等待状态可以成为一个复合状态,其状态对应于这些特定条件。

Blocked: 在等待监视器锁定进入同步块或方法(synchronized)或在调用Object.wait()后重新进入同步块或方法时, 线程处于Blocked阻塞状态。

Terminated: 线程完成run()方法的执行后,它将进入Terminated状态。

翻译的水平有限,不太明白还可以看这里第三个回答 

猜你喜欢

转载自my.oschina.net/zjllovecode/blog/1630725