在 Java 里,线程有 6 种执行状态,这些状态都在 java.lang.Thread.State
枚举类中被定义。下面为你详细介绍这些状态:
1. NEW(新建状态)
当你创建了一个 Thread
对象,却还未调用其 start()
方法时,线程就处于新建状态。此时,线程仅仅是一个对象实例,操作系统还未为其分配资源和执行环境。
示例代码:
java
Thread thread = new Thread(() -> {System.out.println("线程正在执行");
});
// 此时 thread 处于 NEW 状态
2. RUNNABLE(可运行状态)
调用 start()
方法之后,线程就进入了可运行状态。这一状态又包含两种情况:
- 就绪状态:线程已经获取了除 CPU 之外的所有必要资源,正在等待操作系统的调度以获取 CPU 时间片。
- 运行状态:线程已经获得 CPU 时间片,正在执行其
run()
方法中的代码。
示例代码:
java
Thread thread = new Thread(() -> {System.out.println("线程正在执行");
});
thread.start();
// 调用 start() 后,线程进入 RUNNABLE 状态
3. BLOCKED(阻塞状态)
当线程试图获取一个被其他线程占用的锁时,会进入阻塞状态。在获取到锁之前,线程会一直等待。
示例代码:
java
class LockExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println("线程 2 获得锁");}});thread1.start();thread2.start();// 线程 2 可能会进入 BLOCKED 状态,等待线程 1 释放锁}
}
4. WAITING(等待状态)
线程调用以下方法后会进入等待状态:
Object.wait()
Thread.join()
LockSupport.park()
处于等待状态的线程会一直等待,直到其他线程调用对应的唤醒方法,如 Object.notify()
或 Object.notifyAll()
。
示例代码:
java
class WaitingExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程 1 被唤醒");}});Thread thread2 = new Thread(() -> {synchronized (lock) {lock.notify();System.out.println("线程 2 唤醒线程 1");}});thread1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}thread2.start();}
}
5. TIMED_WAITING(定时等待状态)
线程调用以下带有超时参数的方法后会进入定时等待状态:
Thread.sleep(long millis)
Object.wait(long timeout)
Thread.join(long millis)
LockSupport.parkNanos(long nanos)
LockSupport.parkUntil(long deadline)
在指定的时间过去之后,线程会自动恢复到可运行状态。
示例代码:
java
Thread thread = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程等待结束");
});
thread.start();
// 线程进入 TIMED_WAITING 状态,等待 1 秒
6. TERMINATED(终止状态)
线程的 run()
方法执行完毕,或者因异常而提前结束时,线程就进入终止状态。一旦线程进入终止状态,就无法再重新启动。
示例代码:
java
Thread thread = new Thread(() -> {System.out.println("线程正在执行");
});
thread.start();
// 线程执行完毕后进入 TERMINATED 状态
综上所述,Java 线程的 6 种执行状态反映了线程在其生命周期中的不同阶段,了解这些状态有助于你更好地控制和管理线程。