文
章
目
录
章
目
录
Java面试题:Java线程有哪几种状态,相互有什么关系?
得分点:
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
标准回答:
在Java中,线程在其运行生命周期中的任何时刻都会处于以下6种状态之一:
- NEW(新建状态):线程被创建,但尚未调用其start()方法。
- RUNNABLE(可运行状态):线程正在JVM中执行,但可能在等待操作系统的调度。
- BLOCKED(阻塞状态):线程正在等待获取监视器锁,通常发生在同步块或方法中。
- WAITING(等待状态):线程正在等待其他线程的通知或中断,通常通过wait()方法或join()方法引起。
- TIMED_WAITING(超时等待状态):与WAITING状态类似,但具有超时限制,会在超时时间到达时自动返回。
- TERMINATED(终止状态):线程已经执行完毕,生命周期结束。
线程在创建后默认处于NEW状态,调用start()方法后进入RUNNABLE状态。虽然处于RUNNABLE状态表示线程可以运行,但并不一定正在运行,因为它需要等待操作系统的调度。进入等待状态的线程通常需要其他线程的通知才能返回到RUNNABLE状态。超时等待状态是在等待状态的基础上增加了超时时间的限制,一旦超过时间限制,线程会自动返回到RUNNABLE状态。另外,线程在执行同步方法时,如果未获取到锁,会进入BLOCKED状态。线程执行完run()方法后进入TERMINATED状态。
值得注意的是,Java将操作系统中的就绪和运行两个状态合并为可运行状态(RUNNABLE)。线程在等待synchronized的监视器锁时进入BLOCKED状态,而等待Lock锁时进入WAITING状态。这是因为Lock接口实现类在阻塞时使用了LockSupport类的相关方法。
这些不同状态的管理和切换是多线程编程中重要的概念,了解它们有助于开发人员更好地掌握线程的生命周期和行为。