基础面试题——线程有几种状态,状态之间的流转是怎样的?

在 Java 中,线程的状态可以分为六种,
分别是:
新建(NEW) 线程对象已经被创建,但还没有调用 start() 方法启动线程。

可运行(RUNNABLE) 线程已经启动,正在运行或准备运行中。此状态下,线程可能正在 CPU 上执行,也可能在等待 CPU 时间片。

阻塞(BLOCKED) 线程在等待获取一个排他锁(如 synchronized),但该锁被其他线程占用。线程无法继续执行,直到获得锁。

等待(WAITING) 线程无限期地等待其他线程显式唤醒。线程处于这种状态通常是调用了 Object.wait()、Thread.join() 或 LockSupport.park() 方法

超时等待(TIMED_WAITING) 线程等待指定的时间后会自动被唤醒。常见的方法包括 Thread.sleep(long millis)、Object.wait(long timeout)、Thread.join(long millis) 等

终止(TERMINATED) 线程已经执行完毕或因异常退出,进入终止状态。

线程状态流转:

  1. 调用 start() 方法后,线程从新建状态转移到可运行状态
  2. 如果线程在执行过程中需要等待一个锁,它将进入阻塞状态
  3. 如果线程调用了 wait() 方法且没有传入等待时间线程会进入无期限等待状态,
  4. 如果线程调用了 sleep()、wait(long timeout) 或 join(long millis) 等方法,它将进入超时等待状态。
  5. 线程执行完 run() 方法或因异常终止时,线程进入终止状态。
  6. 当线程成功获取到锁,它将从阻塞状态转移到可运行状态。
  7. 当另一个线程调用 notify()、notifyAll() 或 unpark() 时,等待线程将被唤醒,进入可运行状态。
  8. 线程等待时间到达或其他线程提前唤醒时,将从超时等待状态转移到可运行状态。
  9. 线程一旦进入终止状态,就不会再转移到其他状态。

线程状态之间的流转是由各种同步、等待机制控制的,这些状态之间的流转反映了线程的生命周期。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值