线程状态通常分为五种:
New(新建状态):创建线程对象,该线程的生命周期开始,此时该线程已经有了相应的内存空间和其他资源
Runnable(就绪状态):线程对象创建后,调用该线程的start()方法就可以启动线程,当线程启动后就进入就绪状态,由于还没有分配CPU,线程将进入线程队列中排队(可运行的线程池中),等待CPU的服务,此时该线程具备了运行条件
Running(运行状态):当就绪状态的线程被调用并获取到了CPU资源,线程进入运行状态,此时,自动调用该线程对象的run()方法,run()定义了该线程的操作逻辑和功能,该状态直到调用其他方法或者发生阻塞才终止
Blocked(阻塞状态):线程因为某种原因放弃CPU的使用权,暂停或停止运行(如需要执行耗时的输入输出操作,将让出CPU的使用权,并暂时中止自己的执行,进入堵塞状态),堵塞时,线程不能进入排队队列,只有当堵塞的原因被消除后,线程才能转入就绪队列中排队等待,被CPU调度选中后会从原来停止的位置开始继续执行
注意:阻塞被消除后回到就绪状态,不是运行状态
Dead(死亡状态):线程调用stop()方法,destory()方法或run()方法执行结束后,线程就处于死亡状态,处于死亡状态下的线程不具有继续运行的能力
线程运行流程:
通过new关键字创建线程后,进入新生
调用start()方法后进入就绪状态
CPU调度到此线程后,此线程开始执行,就入到运行状态
运行中遇到join,yield,sleep造成阻塞,进入阻塞状态,阻塞原因消除后,又回到就绪状态
线程正常执行完毕或者异常中止后,进入死亡状态
造成线程阻塞的方法:
join,yield,sleep,Object的wait()方法
注意:
遇到join,yield,sleep,Object的等待wait()方法,synchronized,回到就绪状态
温馨提示:
大家可以通过getState()来获取线程当前的状态:
NEW 、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
想要了解更多的线程知识,可以看看我写的上一篇线程与进程