>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28733 个阅读者 刷新本主题
 * 贴子主题:  线程的生命周期和线程的状态转换图 回复文章 点赞(0)  收藏  
作者:日月光华    发表时间:2019-12-29 04:14:07     消息  查看  搜索  好友  邮件  复制  引用

线程的生命周期和线程的状态转换图

一、线程的生命周期

  1、线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)
  2、线程的生命周期图解:(参考传智播客刘意2015Java基础视频讲义)
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
二、线程的状态转换图

  1、线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)
    线程变化的状态转换图例如以下:
      1)新建状态(New):新创建了一个线程对象。
      2)就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的start()方法。该状态的线程位于可执行线程池中,变得可执行,等待获取CPU的使用权。
      3)执行状态(Running):就绪状态的线程获取了CPU。执行程序代码。
      4)堵塞状态(Blocked):堵塞状态是线程由于某种原因放弃CPU使用权。临时停止执行。直到线程进入就绪状态,才有机会转到执行状态。
        堵塞的情况分三种:
          (一)等待堵塞:执行的线程执行wait()方法,JVM会把该线程放入等待池中。
          (二)同步堵塞:执行的线程在获取对象的同步锁时,若该同步锁被别的线程占用。则JVM会把该线程放入锁池中。
          (三)其它堵塞:执行的线程执行sleep()或join()方法,或者发出了I/O请求时。JVM会把该线程置为堵塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完成时。线程又一次转入就绪状态。
      5)死亡状态(Dead):线程运行完了或者因异常退出了run()方法,该线程结束生命周期。

  2、线程的状态转换图
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
  3、解释(参考 https://www.cnblogs.com/bhlsheji/p/5099362.html)
    1)线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但无论如何,当我们new了这个对象后。线程就进入了初始状态;
    2)当该对象调用了start()方法,就进入可执行状态;
    3)进入可执行状态后,当该对象被操作系统选中。获得CPU时间片就会进入执行状态;
    4)进入执行状态后情况就比较复杂了
      (1)run()方法或main()方法结束后,线程就进入终止状态;
      (2)当线程调用了自身的sleep()方法或其它线程的join()方法,就会进入堵塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后。该线程进入可执行状态,继续等待OS分配时间片;
      (3)线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可执行状态,这时与其它进程处于同等竞争状态,OS有可能会接着又让这个进程进入执行状态;
      (4)当线程刚进入可执行状态(注意,还没执行),发现将要调用的资源被synchroniza(同步),获取不到锁标记。将会马上进入锁池状态,等待获取锁标记(这时的锁池里或许已经有了其它线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可执行状态。等待OS分配CPU时间片;
      (5)当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的全部资源,与堵塞状态不同)。进入这个状态后。是不能自己主动唤醒的,必须依靠其它线程调用notify()或notifyAll()方法才干被唤醒(因为notify()仅仅是唤醒一个线程,但我们由不能确定详细唤醒的是哪一个线程。或许我们须要唤醒的线程不可以被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池。等待获取锁标记。


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->Swing组件(下)
  JavaWeb开发-->JSP技术详解(Ⅰ)
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->用Axis发布Web服务
  精通Spring-->组合(Composition)API
  Vue3开发-->Vue Router路由管理器
  [原创]汽車美容
  孙卫琴的视频课程的源代码下载
  序列化与反序列化知识点汇总
  观察者模式和发布订阅模式的区别
  好消息:孙卫琴老师等直播分享Java分布式架构专题
  Java并发编程之验证volatile不能保证原子性
  Eclipse的安装配置
  java常见的几种调用机制:同步调用,异步调用,回调
  Eclipse使用指南:快速修复功能
  Java 入门实用代码:从 List列表中 截取子列表
  Java入门实用代码:向文件写入字符串
  Java入门实用代码: 方法重载
  Java入门实用代码:字符串小写转大写
  Java Pattern和Matcher字符匹配详解
  java零基础入门-面向对象篇 抽象类
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。