线程生命周期状态图
新建状态(NEW)
当程序
使用new关键字创建一个线程之后
,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值,它将保持这个状态直到程序调用它的start()方法。
就绪状态(RUNNABLE)
当线程对象
调用了start()方法之后
,该线程处于就绪状态。JVM会为其创建方法调用栈和程序计数器,等待调度器调度运行。
运行状态(RUNNING)
如果
处于就
绪状态
的线程获得了CPU,开始执行 run()方法,
则该线程转为
运行态
。线程执行期间可能会在
就绪态和
运行态之间来回切换,当cpu分配的时间片用完或线程执行yield()方法主动放弃时间片,线程由
运行态转为
就绪态,重新等待调度器的调度。
阻塞状态(BLOCKED)
阻塞状态是指线程因为某种原因放弃了cpu使用权,让出了cpu时间片,暂时停止运行。直到线程进入
就绪态
,才有机会再次获得cpu时间片转到
运行态
。阻塞的情况分三种:
等待阻塞
:
运行态
的线程执行wait()方法,JVM 会把该线程放入等待队列中。
同步阻塞:
运行态
的线程在获取对象的同步锁时,若该
同步锁被别的线程占用,
则JVM会把该线 程放入锁池(lock pool)中。
其他阻塞:
运行态
的线程执行sleep()或 join()方法,或者发出了 I/O 请求时,JVM 会把该线程置为
阻塞态
。当sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转为
就绪态
。
线程死亡(DEAD)
线程会以下面三种方式结束,结束后就是死亡状态。
正常结束
run()或 call()方法执行完成,线程正常结束。
异常结束
线程抛出一个未捕获的 Exception 或 Error。
调用
stop
直接调用该线程的 stop()方法来结束该线程,该方法容易导致死锁
,不推荐使用。