在Java中,线程是程序执行的最小单元。理解线程状态对于编写高效且稳定的并发程序至关重要。本文将详细介绍Java线程的常见状态,以及线程状态之间的切换方法。
一、Java线程状态简介
Java线程的生命周期可以分为以下几个状态:
- 新建(New):线程对象被创建后处于此状态。
- 可运行(Runnable):线程获得CPU时间,开始执行。
- 阻塞(Blocked):线程因等待某个资源(如锁)而无法继续执行。
- 等待(Waiting):线程在等待某个事件(如通知)而无法继续执行。
- 计时等待(Timed Waiting):线程在等待某个事件,但有一个超时限制。
- 终止(Terminated):线程执行完毕,生命周期结束。
二、线程状态的切换
线程状态之间的切换是由线程的行为和外部事件触发的。以下是一些常见的线程状态切换情况:
1. 新建到可运行
当线程被创建并调用start()方法时,它将从新建状态转换为可运行状态。
Thread thread = new Thread();
thread.start(); // 从新建状态转换为可运行状态
2. 可运行到阻塞
线程尝试获取一个已被其他线程持有的锁时,它将进入阻塞状态。
synchronized (object) {
// 线程尝试获取锁,如果被占用,则进入阻塞状态
}
3. 可运行到等待
线程调用wait()方法,或者在等待某个条件时,将进入等待状态。
object.wait(); // 线程进入等待状态
4. 可运行到计时等待
线程调用sleep(long millis)方法时,将进入计时等待状态,直到指定的毫秒数过去。
Thread.sleep(1000); // 线程进入计时等待状态,持续1秒
5. 阻塞到可运行
当被阻塞的线程获取到所需的资源时,它将重新进入可运行状态。
6. 等待到可运行
线程在等待某个事件,如被其他线程调用notify()或notifyAll()方法时,将重新进入可运行状态。
object.notify(); // 被等待的线程进入可运行状态
7. 终止到新建
在极端情况下,线程可以从终止状态重新创建。
三、常见线程状态示例
以下是一些常见的线程状态切换示例:
public class ThreadStateExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
System.out.println("Thread running...");
Thread.sleep(1000); // 线程进入计时等待状态
System.out.println("Thread resumed...");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start(); // 线程从新建状态转换为可运行状态
synchronized (thread) {
try {
thread.wait(); // 线程进入等待状态
System.out.println("Thread notified...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
thread.interrupt(); // 线程从阻塞状态转换为可运行状态
System.out.println("Thread interrupted...");
}
}
四、总结
通过本文的介绍,相信你已经对Java线程状态有了更深入的了解。在实际编程中,理解线程状态及其切换方法对于编写高效的并发程序至关重要。希望本文能帮助你更好地掌握Java线程状态。
