Thread States in Java

2025年5月10日 | 阅读 4 分钟

线程是正在执行的程序,它被创建以执行特定任务。Java 线程的生命周期从其诞生开始,到其死亡结束。

Thread 类的 start() 方法用于启动线程的执行,线程进入可运行状态;Thread 类的 sleep() 和 wait() 方法将线程置于不可运行状态。

在非可运行状态之后,线程再次进入可运行状态并开始执行。线程的 run() 方法非常重要。在执行完 run() 方法后,线程的生命周期就完成了。

线程的这些阶段都是 Java 线程中的线程状态。

要在程序中使用线程,识别线程状态很重要。下图显示了 Java 线程生命周期中的线程状态。

Thread States in Java

Thread States in Java

线程是程序中的一条执行路径,它会经历以下线程状态。这五种状态如下:

  1. 新建
  2. Runnable
  3. 运行中 (Running)
  4. 阻塞 (Blocked) (不可运行状态)
  5. 已死 (Dead)

新建 (Newborn State)

当创建 Thread 类的实例时,一个新线程诞生,并进入新生状态。也就是说,当线程诞生时,它进入新状态,但其执行阶段尚未在实例上开始。

简而言之,Thread 对象已被创建,但它不能执行任何程序语句,因为它不处于线程的执行状态。只能在新建线程上调用 start() 方法;否则,将抛出 **IllegalThreadStateException** 异常。

可运行状态 (Runnable State)

新生线程的第二个阶段是执行阶段。当在线程的新实例上调用 start() 方法时,它会进入可运行状态。
在可运行状态下,线程已准备好执行,并正在等待处理器(CPU 时间)的可用性。有许多线程已准备好执行,它们都在队列(行)中等待。

如果所有线程具有相等的优先级,CPU 会根据先来先服务的原则为每个线程的执行分配一个时间片。分配时间给线程的过程称为**时间分片 (time slicing)**。线程可以从运行中、等待中或新建状态进入可运行状态。

运行状态 (Running State)

运行状态意味着处理器(CPU)已为线程分配了执行时间片。当线程调度器从可运行状态选择一个线程执行时,它会进入运行状态。请看上图。

在运行状态下,处理器为其执行分配时间,并执行其 run 方法。这是线程执行其实际功能的状态。线程只能从可运行状态进入运行状态。

运行中的线程可能在以下任何一种情况下放弃其控制,并进入阻塞状态。

  1. 当对线程调用 sleep() 方法使其休眠指定时间时,在此期间线程将从队列中移出。时间段结束后,线程会立即重新进入可运行状态。
  2. 当线程使用 suspend() 方法被挂起一段时间以满足某些条件时。可以通过 resume() 方法唤醒挂起的线程。
  3. 当对线程调用 wait() 方法使其等待一段时间时。处于等待状态的线程可以使用 notify() 或 notifyAll() 方法再次运行。

阻塞状态 (Blocked State)

当线程被挂起、休眠或等待一段时间以满足某个条件时,它就被认为是处于阻塞状态。

已死状态 (Dead State)

当线程的 run() 方法完成语句执行时,线程就会死亡或进入死亡状态。也就是说,当线程退出 run() 方法时,线程就被终止或死亡。当调用 stop() 方法时,线程也可能死亡。

在 Java 线程的生命周期中,线程会以多种方式从一个状态移动到另一个状态。这是因为在多线程环境中,当多个线程执行时,一次只有一个线程可以使用 CPU。

所有其他线程都处于其他状态,要么在等待 CPU 时间轮转,要么在等待满足某些条件。因此,线程始终处于这五种状态之一。

Java 线程程序

ThreadDemo.java

输出

Thread 1
i in Thread 1 
i = 1
Main Thread End
Thread 2
i in Thread 2 
i = 1
i = 2
i = 3
i = 4
i = 5
Thread 2 Completed.
i = 2
i = 3
i = 4
i = 5
Thread 1 Completed.

在上面的程序中,通过创建 Thread 类的实例 t1 和 t2 来实现 Java 线程。实现了 Thread 类的 start()、yield()、run()、sleep() 等不同方法。