Java面试八股之线程有哪几种状态

发布于:2024-05-21 ⋅ 阅读:(64) ⋅ 点赞:(0)
  1. Java中线程有哪几种状态

在Java中,线程的状态主要由 `java.lang.Thread.State` 枚举类定义,具体有以下几种状态:

1. NEW(新建状态):

当使用 `new` 关键字创建一个 `Thread` 对象后,线程就处于新建状态。此时,它只是一个对象,尚未成为一个真正的执行线程。源码中没有直接体现状态,但可以通过构造函数看出线程对象的创建。

2. RUNNABLE(可运行状态):

当调用了线程的 `start()` 方法后,线程就进入了可运行状态。这个状态包括了操作系统层面的Ready(准备就绪)和Running(正在运行)。在Java源码中,没有直接的Running状态标识,都统一归纳在RUNNABLE状态里。此状态表示线程可以被线程调度器选择执行,但不一定正在CPU上执行。

3. BLOCKED(阻塞状态):

当线程试图获取一个内部对象锁(synchronized锁)或者其他外部资源(如锁、I/O操作)但未成功时,就会进入阻塞状态。在源码中,当线程在等待监视器锁时,其状态会被标记为BLOCKED。

4. WAITING(无限期等待):

当线程调用了 `Object.wait()` 方法,或者 `Thread.join()` 方法且没有指定等待时间,或者 `LockSupport.park()` 方法时,线程会进入无限期等待状态。这些方法都会导致线程释放持有的监视器锁(如果有的话),并进入等待状态直到被其他线程显式唤醒。

5. TIMED_WAITING(限期等待):

当线程调用了带有超时参数的方法,如 `Thread.sleep(long millis)`、`Object.wait(long timeout)`、`Thread.join(long millis)`、`LockSupport.parkNanos(long nanos)`、`LockSupport.parkUntil(long deadline)` 时,线程会进入一个有限时间的等待状态。与WAITING状态相似,但它将在指定时间后自动醒来或被中断唤醒。

6. TERMINATED(终止状态):

如果线程的 `run()` 方法执行完毕,或者因异常退出了 `run()` 方法,那么线程就进入了终止状态。源码中,当线程执行完成或者因异常退出时,其状态会被标记为TERMINATED。

这些状态之间的转换通过Java的线程API操作和JVM的线程调度来实现,源码层面的状态改变通常通过修改 `Thread` 内部的 `volatile State` 变量来完成,而这些状态转换逻辑分布在 `Thread` 类的不同方法中,例如 `start()`、`join()`、`sleep()`、`wait()` 等。每个状态的转换都伴随着相应的同步和线程调度机制,确保了线程安全和执行的正确性。

 如果大家需要视频版本的讲解,欢迎关注我的B站: