📜  Java中线程的生命周期和状态(1)

📅  最后修改于: 2023-12-03 15:02:03.896000             🧑  作者: Mango

Java中线程的生命周期和状态

线程生命周期

Java中的线程生命周期包括五个状态:

  1. New (新建状态) -- 当线程对象被创建时,它将处于新建状态。此时它还没有被分配CPU时间片,也没有开始运行。

  2. Runnable (可运行状态) -- 当调用start()方法时,线程进入可运行状态。这表明线程已经被添加到调度队列中,CPU可以随时执行它。在这个状态下,线程可能正在执行,也可能没有执行,这取决于底层操作系统的调度器。因此,在多处理器系统中,一个线程可能同时处于运行和可运行状态。

  3. Blocked (阻塞状态) -- 当线程等待一个监视器锁时,它将处于阻塞状态。当线程试图获取一个被其他线程持有的锁时,它将进入等待队列,并且处于阻塞状态。

  4. Waiting (等待状态) -- 当线程等待另一个线程执行特定操作时,它将处于等待状态。这是通过调用wait()、join()或park()方法来实现的。

  5. Terminated (终止状态) -- 当run()方法执行结束时,线程将进入终止状态。线程不会自动从终止状态中恢复,因此它将永远停止执行。

线程状态

线程状态可以通过Thread类中的getState()方法获得。

以下是每个线程状态的详细描述。

  1. NEW (新建状态)

当我们创建一个线程时,它将处于新建状态。此时线程还没有被启动。getState()方法将返回NEW。

Thread t = new Thread();
System.out.println(t.getState());  // 输出 "NEW"
  1. RUNNABLE (可运行状态)

当我们调用start()方法,线程将开始执行,进入可运行状态。getState()方法将返回RUNNABLE。在可运行状态下,线程可能被执行,也可能没有被执行,这取决于操作系统的调度器。

t.start();
System.out.println(t.getState()); // 输出 "RUNNABLE"
  1. BLOCKED (阻塞状态)

一个线程在等待获得一个监视器锁时,它将进入阻塞状态。例如,当一个线程等待一个对象的notify()方法时,它将进入阻塞状态。getState()方法将返回BLOCKED。

synchronized(obj) {
    obj.wait();
}
System.out.println(t.getState()); // 输出 "BLOCKED"
  1. WAITING (等待状态)

一个线程在等待另一个线程执行特定操作时,它将进入等待状态。这是通过调用wait()、join()或park()方法来实现的。getState()方法将返回WAITING。

Thread t2 = new Thread(() -> {
    synchronized(obj) {
        try {
            obj.wait();  // 等待 "obj" 对象被唤醒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
t2.start();
t2.join();
System.out.println(t2.getState()); // 输出 "WAITING"
  1. TIMED_WAITING (超时等待状态)

当一个线程在等待阻塞操作时,可以指定一个超时时间。在超时时间内如果操作没有完成,线程将进入超时等待状态。getState()方法将返回TIMED_WAITING。

Thread t3 = new Thread(() -> {
    try {
        Thread.sleep(1000); // 线程睡眠1秒钟
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});
t3.start();
t3.join(200);
System.out.println(t3.getState()); // 输出 "TIMED_WAITING"
  1. TERMINATED (终止状态)

当线程执行完run()方法时,线程将进入终止状态。getState()方法将返回TERMINATED。

t.join();
System.out.println(t.getState()); // 输出 "TERMINATED"
总结

Java中的线程有五个生命周期状态:New、Runnable、Blocked、Waiting和Terminated。可以通过线程对象的getState()方法获取线程的状态。理解线程的生命周期和状态对于编写正确的多线程程序至关重要。