美文网首页
【多线程入门系列四】线程的生命周期

【多线程入门系列四】线程的生命周期

作者: 5d44bc28b93d | 来源:发表于2018-03-13 22:18 被阅读20次
美图.jpg

线程的生命周期


  • 线程的五大状态:

    • 新建(New):

      • 线程并不是一创建就处于运行状态,也就是当我们new创建一个线程时,此时线程处于新建态。
    • 就绪态(Runnable):

      • 当线程对象调用了start()方法之后,该线程由新建态转换为就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
    • 运行态(Running):

      • 当线程获得cpu资源并开始执行run方法时,此时线程处于运行态
    • 阻塞态(Blocked):

      • 当线程在运行状态时,失去cpu资源,此时线程处于阻塞状态
    • 死亡态(Dead):

      • run()或call()方法执行完成,线程正常结束
      • 线程抛出一个未捕获的Exception或Error
      • 直接调用了线程的stop方法暴力杀死线程时

线程状态转换.jpg
  • 线程间的状态转换

    • 新建态 转 就绪态

      • 通过new关键字创建线程时,jvm其分配内存,并初始化其成员变量的值,此时线程处于新建态。当线程对象调用了start()方法之后,该线程处于就绪状态。jvm会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度
    • 就绪态 转 运行态

      • 当处于就绪状态的线程获得了CPU资源,开始执行run()方法时,则该线程处于运行状态,如果计算机只有一个CPU。那么在任何时刻只有一个线程处于运行状态,当然在一个多处理器的机器上,将会有多个线程并行执行;当线程数大于处理器数时,依然会存在多个线程在同一个CPU上轮换的现象。

      • 当线程开始运行时,线程不可能一直处于运行态,除非线程极快的执行完。线程在运行过程中需要被中断,目的是使其他线程获得执行的机会。对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间段来处理任务;当该时间段用完后,系统就会剥夺该线程所占用的资源,让其他线程获得执行的机会。在选择下一个线程时,系统会考虑线程的优先级.

    • 运行态 转 阻塞态

      • 当线程尝试获取同步锁,而锁被其他线程占用,此时线程处于阻塞态

      • 当线程调用sleep方法时,此时线程主动放弃cpu资源,此时线程进入阻塞态

      • 程序调用了线程的suspend()方法将该线程挂起

      • 线程在等待某个通知(notify)等

    • 阻塞态 转 就绪态

      • 获得同步锁
      • sleep时间到
      • 等待通知时,其他程序发送了通知
      • 处于挂起阻塞状态时,调用了resume方法恢复
    • 运行态 转 就绪态

      • yield()让出cpu资源
      • 失去cpu资源时。

相关文章

网友评论

      本文标题:【多线程入门系列四】线程的生命周期

      本文链接:https://www.haomeiwen.com/subject/imnqfftx.html