线程的生命周期是指线程从创建到销毁的整个过程,在这个过程中线程会经历不同的状态。以下是线程生命周期中常见的状态及其转换过程:
线程的状态
- 新建(New):当线程被创建时,它处于新建状态。此时线程对象已经被分配了内存空间,相关的资源也已经被初始化,但线程尚未开始执行。
- 就绪(Runnable):线程创建后,调用
start()
方法,线程进入就绪状态。处于就绪状态的线程具备了运行的条件,但还没有被分配到CPU时间片,需要等待CPU调度才能执行。 - 运行(Running):当就绪状态的线程获得了CPU时间片,开始执行
run()
方法中的代码,此时线程处于运行状态。在运行状态下,线程会一直执行,直到完成任务或者因为某些原因暂停。 - 阻塞(Blocked):线程在运行过程中,可能会因为某些原因而暂停执行,进入阻塞状态。例如,线程在等待获取锁、等待I/O操作完成、调用
sleep()
方法或wait()
方法等情况。处于阻塞状态的线程不会占用CPU时间片,直到导致阻塞的原因解除,线程才会重新回到就绪状态,等待CPU调度再次进入运行状态。 - 死亡(Dead):当线程的
run()
方法执行完毕,或者因为异常等原因导致线程提前终止,线程就会进入死亡状态。处于死亡状态的线程不再具备运行的能力,它所占用的资源会被系统回收。
状态转换
- 新建到就绪:通过调用线程的
start()
方法,将线程从新建状态转换为就绪状态,使线程具备运行的条件,等待CPU调度。 - 就绪到运行:当CPU调度器选择了就绪状态的线程来执行时,该线程就会进入运行状态,开始执行
run()
方法中的代码。 - 运行到阻塞:当线程遇到如等待获取锁、执行
sleep()
方法、执行wait()
方法或者进行I/O操作等情况时,会从运行状态转换为阻塞状态。 - 阻塞到就绪:当导致阻塞的原因解除时,例如等待的锁被释放、
sleep
时间结束、wait
被唤醒或者I/O操作完成等,线程会从阻塞状态转换为就绪状态,重新进入就绪队列等待CPU调度。 - 运行到就绪:当运行状态的线程执行完当前的时间片或者遇到优先级更高的线程需要运行时,线程会从运行状态转换为就绪状态,等待下一次被CPU调度执行。
- 运行到死亡:当线程的
run()
方法执行完毕或者出现未处理的异常导致线程提前终止,线程会从运行状态进入死亡状态。