用排队买票的场景去理解JAVA线程间的状态转换

2023-10-09 21:59

本文主要是介绍用排队买票的场景去理解JAVA线程间的状态转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用排队买票的情景去理解JAVA线程间的状态转换在此输入图片描述

在此输入图片描述

  1. 新建(new):新创建了一个线程对象。 (大家好,我是新来的,老爸是个程序猿,今天要给全家买火车票过几天趁着国庆开开心心去旅游----新生状态)

  2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。 (我时刻准备着买票----准备状态)

  3. 运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。 (买票时跟出票mm交流顺便泡妞,需折腾一段时间【CPU 理解为出票mm的交流时间(Chu Piao Unit】----买票状态)

  4. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。---- 人塞人状态 阻塞的情况分三种: (一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。 (进到售票大厅惊呆了!人超多,好拥挤啊!大厅里面非常有秩序,一进去,就被彪悍的保安大哥塞在售票大厅的其中一个队伍中排队!排队前,程序猿老爸不让我拿着所有的身份证先----排队状态) Java Thread State 线程状态为“waiting for monitor entry”

(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。 (好不容易轮到自己,才发现原来是每三排队伍才对应一个出票mm,谁争到谁先买票,赶紧去抢!---争抢状态) Java Thread State 线程状态为“in Object.wait()”:

(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。 当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。 (跟售票mm交流买票眼神耗太多了,犯困了,干脆睡个短觉或者化身雷锋让急着赶回家看病的老人先买张票上车!先让让吧,反正我是这个队伍的第一位,身份证可都在我手上握紧不放--- 礼让状态) Java Thread State 线程状态为“waiting on condition”

  1. 死亡(dead):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。 (买到全部票了!终于可以回家了!---- 解放状态)

“碧池”大家都听说过吧! 回头一望那售票大厅,正在排队那一帮人叫“猥池(等待池waiting pool)”,正在争抢出票mm那一帮人叫“琐池”(锁池lock pool) !

现在,闭上你的眼睛,想象买票场景的各种感受,可帮助您记住线程状态变化的各种流程! 若有误导请留言指正! 若有更多情景,请留言提醒!

参考《一张图让你看懂JAVA线程间的状态转换》 http://my.oschina.net/mingdongcheng/blog/139263 《Java多线程:线程状态》 http://blog.csdn.net/huang_xw/article/details/7316354 《在 TDA 工具里看到 Java Thread State 的第一反应是》 http://itindex.net/detail/43158-tda-%E5%B7%A5%E5%85%B7-java

转载于:https://my.oschina.net/u/175978/blog/314183

这篇关于用排队买票的场景去理解JAVA线程间的状态转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175832

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态