线程的生命周期(线程间的状态转换)

线程的状态分为如下几种:

jdk的源代码介绍: java.lang.Thread.State

public enum State {

      // 新建状态 - 尚未启动的线程处于这种状态。
      NEW,

      // 可运行状态 - 可运行的线程状态,该线程已经可以在java虚拟机执行,其可能在等待其他资源,如操作系统的中央处理器等。
      RUNNABLE,

      // 阻塞状态 - 一个线程在等待另一个持有同一监控锁的线程而引起的阻塞状态(A,B线程同时执行某个同步方法或同步代码块,A线程没抢到同步锁,而B线程抢到了同步锁,那么A线程被阻塞了,则A线程进入到阻塞状态)
      BLOCKED,

      // 等待状态 - A线程调用B线程,而B线程执行特定的动作时耗时较长而引起A程进入等待状态,该状态不能和阻塞状态混淆
      WAITING,

      // 超时等待状态 - 具有指定等待时间的等待线程的线程状态。线程处于定时等待状态。
      TIMED_WAITING,

      // 结束状态 - 线程生命周期结束、停止、死亡后的状态
      TERMINATED;
  }

线程生命周期图:
线程生命周期

状态说明:

1、新建状态(new): 一个线程刚刚创建出来,但还未执行start()方法。
2、可运行状态(runnable): 线程调用了该对象的start()方法后,线程位于可运行的线程池中,变得可运行,等待获取cpu的使用权。
3、运行状态(running): 可运行态的线程获取到了cpu的使用权后,执行程序代码就为运行态。
4、等待状态:处于运行态的线程可以通过各种手段是运行态的线程等待或阻塞,当等待或阻塞结束,又可以恢复到可运行态,线程等待有下面三种情况:
4.1、超时等待状态(timedwaiting): 运行中的线程通过调用sleep()或join()方法,或发出I/O请求时,JVM会把该线程挂起等待,当超时时间达到时或I/O操作完成时,线程重新进入到可运行态(注意:如果线程持有锁,线程sleep的过程中不会释放锁)。
4.2、普通等待状态(waiting): 处于运行态的线程通过调用wait()方法,JVM会把该线程放入到等待池中(注意:如果线程持有锁,线程wait的过程中会释放锁)
4.3、阻塞等待状态(blocked): 处于运行态的线程在获取对象的同步锁时,如果该同步锁正被别的线程所占用,则JVM会把该线程放入到锁池中进行等待,直到获取到锁后,线程才又进入到可运行态。
5、终止状态(terminated): 线程执行完或由于异常而退出,该线程的生命周期结束。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值