线程的状态及阻塞

之前提到了线程和进程,那就提一下线程的状态吧!

线程状态通常分为五种:

  • 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

想要了解更多的线程知识,可以看看我写的上一篇线程与进程

你可能感兴趣的:(Java,线程,嵌入式开发,java)