线程生命周期(状态)
2019-05-01 本文已影响0人
趁年轻多奋斗
当线程创建并启动后,他并不是一启动就进入执行状态,也不是一直都处在执行状态。会经常在运行与阻塞进行线程切换。线程经过状态:新建(new)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。
新建状态
当程序使用new创建一个线程是,当前线程处于新建状态,此时由JVM为其分配内存,并初始化其成员变量的值。
就绪状态
当线程调用start()方法后,该线程就处在就绪状态。JVM会为其创建方法调用栈和程序计数器,等待调度运行。
运行状态
当线程处于就绪状态并获得CPU时,开始执行run()方法线程执行体。则线程处于运行状态。
阻塞状态
指线程因为某种原因放弃了CPU使用权,也即让出了CPU timeslice,暂时停止运行。直到线程进入可运行状态,才有机会再次获得CPU timeslice转到运行状态。阻塞分为三种 :
- 等待阻塞:运行线程执行o.wait()方法,JVM会把线程放到等待队列中。
- 同步阻塞(lock→锁池):运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
- 其他阻塞(sleep/join):运行的线程执行Thread.sleep(long ms)或t.join()方法,或者发出I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入可运行(就绪)状态。
线程死亡
流程图
- 正常结束:run()或call()方法执行完成,线程正常结束。
- 异常结束:线程抛出一个未捕获Exception或Error。
- 调用stop:直接调用线程的stop()方法,该方法容易导致死锁。