AI摘要:线程状态及其转换条件是多线程编程中的关键概念。线程从新建(NEW)状态开始,调用.start()后变为运行(RUNNABLE)状态。线程可能因等待锁、I/O操作或定时任务而进入阻塞(BLOCKED)、等待(WAITING)或计时等待(TIME_WAITING)状态。任务完成或异常发生后,线程进入终止(TERMINATED)状态。状态转换涉及锁竞争、条件等待、时间等待和线程通知等操作。了解这些状态和转换有助于优化多线程程序的性能和稳定性。
Powered by AISummary.
浅谈线程状态及状态转换条件
1. NEW(新建状态)
这是线程刚被创建但尚未启动的状态。在此状态下,虽然线程对象已经存在,但在调用.start()
方法之前,线程不会执行实际任务。当调用.start()
方法后,线程会进入到RUNNABLE
状态。
2. TERMINATED(终止状态)
在线程的任务执行完成、抛出异常或者调用.stop()
方法后,线程进入终止状态。在这种状态下,虽然线程对象仍然存在,但是内核中的线程已经结束,不再执行任务。
3. RUNNABLE(运行状态)
线程在 CPU 上执行,或者在队列中等待 CPU 时间时,处于 RUNNABLE
状态。这是线程执行任务的活跃状态。
4. TIME_WAITING(计时等待状态)
有时候,线程需要在一段时间内暂时阻塞自己,例如通过调用Thread.sleep()
方法。进入TIME_WAITING
状态后,线程会等待指定的时间后恢复到RUNNABLE
状态,或者当等待时间结束后,自动切换到RUNNABLE
状态。这种状态对于需要暂停一段时间或进行定时任务的情况很有用。
5. WAITING(等待状态)
当线程在等待某些条件满足时,会进入WAITING
状态。通常通过调用Object.wait()
方法实现。在这种状态下,线程会释放其持有的锁,并暂停执行,直到其他线程通知它可以继续执行。
6. BLOCKED(阻塞状态)
线程在某些情况下可能被阻塞,例如等待I/O操作完成或等待获取某个对象的锁。当线程进入BLOCKED
状态时,它会暂时停止执行,直到满足解除阻塞的条件为止。
状态切换条件总结
NEW
->RUNNABLE
:调用线程的.start()
方法。RUNNABLE
->BLOCKED
:竞争锁失败,被其他线程占用锁资源。RUNNABLE
->WAITING
:调用了Object.wait()
等方法,主动释放锁,等待其他线程通知。RUNNABLE
->TIME_WAITING
:调用Thread.sleep()
等方法,暂时阻塞自己一段时间。RUNNABLE
->TERMINATED
:线程的任务执行完成。BLOCKED
->RUNNABLE
:成功获取到锁资源。WAITING
->RUNNABLE
:被其他线程通知,等待结束。TIME_WAITING
->RUNNABLE
:等待时间结束。WAITING
、TIME_WAITING
->TERMINATED
:调用Thread.stop()
方法,或线程被中断。