java并发(三)之线程的生命周期(状态)
- 线程在启动后不是一开始就处于执行状态,也不会一直处于一个状态,线程拥有一个自己的生命周期,分为五种状态,它要经过 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5 种状态。
新建状态(New)
当创建一个线程之后,JVM为其分配内存,并初始化它的成员变量的值,当还没有调用start()方法之前,此时的线程与普通的java对象是没有差别的,等start()方法调用之后才会被当成一个线程对象处理。
就绪状态(Runnable)
这个状态线程已经处于可运行的状态,Java 虚拟机会为其创建方法调用栈和程序计数器,等待调度运行,当然想要得到CPU的使用权运行,还得看操作系统如何分配。
运行状态(Running)
当就绪态的线程获得CPU的使用权后就开始运行,会执行线程的方法体,获取结束后,CPU会剥夺资源。
阻塞状态(Blocked)
阻塞状态是因为线程因为一些其他的原因放弃了CPU的执行权。下面我们来分析三种阻塞:
- 等待阻塞:线程调用wait()方法,线程进入阻塞状态;
- 同步阻塞:线程在获取对象的同步锁时,若该同步锁被别的线程占用,线程则进入阻塞状态;
- 其他阻塞: 线程调用sleep(),join()方法或者出现i/o请求的时候,线程进入阻塞状态,当
sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入可运行(runnable)状态。
死亡状态(Dead)
线程会以下面三种方式结束,结束后就是死亡状态。
正常结束
- run()或 call()方法执行完成,线程正常结束。
异常结束 - 线程抛出一个未捕获的 Exception 或 Error。
调用 stop - 直接调用该线程的 stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。