在 Java 中,线程具有明确的生命周期和状态。理解线程的生命周期对我们编写高效、稳定的多线程程序至关重要。
一、线程的状态
Java 中的线程主要有以下几种状态:
- 新建状态 (
NEW
) - 线程被创建,但尚未启动。 - 就绪状态 (
RUNNABLE
) - 线程已经被启动,准备好运行,但可能因为调度原因暂时未获得 CPU 时间。 - 运行状态 (
RUNNING
) - 线程正在执行。 - 阻塞状态 (
BLOCKED
) - 线程因等待锁而被阻塞,无法继续执行。 - 等待状态 (
WAITING
) - 线程等待其他线程的通知,以恢复执行。 - 超时等待状态 (
TIMED_WAITING
) - 线程在指定时间内等待。 - 死亡状态 (
TERMINATED
) - 线程执行完毕或由于异常终止。
二、线程的生命周期
线程的生命周期从线程的创建开始,通过多个状态间的转换,直到线程的终止。以下是线程状态之间的转换:
NEW
→RUNNABLE
:调用start()
方法使线程进入就绪状态。RUNNABLE
→RUNNING
:线程获得 CPU 时间片,开始执行。RUNNING
→BLOCKED
:线程尝试获取一个已经被其他线程持有的锁。RUNNING
→WAITING
:线程调用wait()
、join()
或LockSupport.park()
方法进入等待状态。RUNNING
→TIMED_WAITING
:线程调用sleep(long millis)
、wait(long timeout)
等方法进入超时等待状态。BLOCKED
→RUNNABLE
:当线程获取到锁后,继续执行。WAITING
→RUNNABLE
:当其他线程调用notify()
、notifyAll()
或当前线程的 join 方法时,线程恢复执行。TIMED_WAITING
→RUNNABLE
:超时时间到达,线程恢复执行。RUNNING
→TERMINATED
:线程执行结束,进入死亡状态。
三、线程控制
我们可以通过多种方式控制线程的状态与行为,以下是一些常用的方法。
1. 启动线程
使用 Thread
类的 start()
方法启动线程。
1 | class MyThread extends Thread { |
2. 线程的休眠
使用 Thread.sleep(long millis)
方法使当前线程休眠指定毫秒数。
1 | public class SleepExample { |
3. 等待与通知
使用 Object.wait()
和 Object.notify()
来控制线程间的协作。
1 | class Resource { |
4. 终止线程
通过设置线程标志位,安全的终止线程。
1 | class StoppableThread extends Thread { |
四、小结
掌握线程的生命周期与控制方法是多线程编程的关键。通过理解线程的状态及其控制机制,可以在并发编程中更有效地管理线程,提高程序的性能和稳定性。使用如 sleep()
、wait()
、notify()
等方法,可以灵活地控制线程执行的顺序与状态,确保资源的有效利用。