java全家桶

线程生命周期(状态)

2019-05-01  本文已影响0人  趁年轻多奋斗

当线程创建并启动后,他并不是一启动就进入执行状态,也不是一直都处在执行状态。会经常在运行与阻塞进行线程切换。线程经过状态:新建(new)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。

新建状态

当程序使用new创建一个线程是,当前线程处于新建状态,此时由JVM为其分配内存,并初始化其成员变量的值。

就绪状态

当线程调用start()方法后,该线程就处在就绪状态。JVM会为其创建方法调用栈和程序计数器,等待调度运行。

运行状态

当线程处于就绪状态并获得CPU时,开始执行run()方法线程执行体。则线程处于运行状态。

阻塞状态

指线程因为某种原因放弃了CPU使用权,也即让出了CPU timeslice,暂时停止运行。直到线程进入可运行状态,才有机会再次获得CPU timeslice转到运行状态。阻塞分为三种 :

  1. 等待阻塞:运行线程执行o.wait()方法,JVM会把线程放到等待队列中。
  2. 同步阻塞(lock→锁池):运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
  3. 其他阻塞(sleep/join):运行的线程执行Thread.sleep(long ms)或t.join()方法,或者发出I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入可运行(就绪)状态。

线程死亡

  1. 正常结束:run()或call()方法执行完成,线程正常结束。
  2. 异常结束:线程抛出一个未捕获Exception或Error。
  3. 调用stop:直接调用线程的stop()方法,该方法容易导致死锁。
流程图
上一篇下一篇

猜你喜欢

热点阅读