当前位置: 首页 > news >正文

Java编程体验:线程的7种状态及相互转换

  先从图片开始

  小小的作下解释:

  1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始状态;

  2、当该对象调用了start()方法,就进入可运行状态;

  3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;

  4、进入运行状态后情况就比较复杂了

  4.1 run()方法或main()方法结束后,线程就进入终止状态;

  4.2 当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;

  4.3 线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;

  4.4 当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池 状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

  4.5 当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤 醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁 池,等待获取锁标记。

  总算全部回忆了一遍JDK1.5在API的使用上有了较好的改进,效率得到很大的提高,不过几个状态转换的原理还是一样。


本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章:

  • 2016年我国物联网行业运行特征浅析
  • 大数据时代的法院管理有何“妙招”
  • 超越预测-二阶分析
  • 美国优先能源计划对我国能源发展战略有何启示?
  • 【胖头陀】协同管理的大时代
  • 虚拟运营商普遍处亏损状态 批发价调整无济于事
  • “正面黑客”解读破解漏洞: 就像追女生
  • servlet中如何发送ajax请求并动态拼接数据到html中
  • Win10新版Build 16215推送:UI风格 功能大提升
  • 加强教育决策的大数据意识
  • 光伏领跑者计划内涵究竟是什么?
  • Atitit.css 规范 bem 项目中 CSS 的组织和管理
  • 输入一列数组,输出它的逆序数组
  • 《软件定义网络:基于OpenFlow的SDN》一一1.6 本章总结
  • 苹果公司反泄露会议细节曝光
  • python3.6+scrapy+mysql 爬虫实战
  • [LeetCode] Wiggle Sort
  • Apache Pulsar 2.1 重磅发布
  • dva中组件的懒加载
  • Facebook AccountKit 接入的坑点
  • JAVA_NIO系列——Channel和Buffer详解
  • vue脚手架vue-cli
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 关于List、List?、ListObject的区别
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 类orAPI - 收藏集 - 掘金
  • 数组大概知多少
  • 听说你叫Java(二)–Servlet请求
  • 一些关于Rust在2019年的思考
  • 原生Ajax
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #NOIP 2014# day.2 T2 寻找道路
  • #QT(串口助手-界面)
  • #微信小程序:微信小程序常见的配置传值
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)winform之ListView
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .jks文件(JAVA KeyStore)
  • .md即markdown文件的基本常用编写语法
  • .NET 解决重复提交问题
  • .net访问oracle数据库性能问题
  • .NET学习教程二——.net基础定义+VS常用设置
  • .net专家(高海东的专栏)
  • .pop ----remove 删除
  • @ConditionalOnProperty注解使用说明
  • @RunWith注解作用
  • @Service注解让spring找到你的Service bean
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [C++]四种方式求解最大子序列求和问题
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径
  • [HAOI2016]食物链
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]