线程的状态及阻塞

简介: 之前提到了线程和进程,那就提一下线程的状态吧!

线程状态通常分为五种:


New(新建状态):创建线程对象,该线程的生命周期开始,此时该线程已经有了相应的内存空间和其他资源

Runnable(就绪状态):线程对象创建后,调用该线程的start()方法就可以启动线程,当线程启动后就进入就绪状态,由于还没有分配CPU,线程将进入线程队列中排队(可运行的线程池中),等待CPU的服务,此时该线程具备了运行条件

Running(运行状态):当就绪状态的线程被调用并获取到了CPU资源,线程进入运行状态,此时,自动调用该线程对象的run()方法,run()定义了该线程的操作逻辑和功能,该状态直到调用其他方法或者发生阻塞才终止

Blocked(阻塞状态):线程因为某种原因放弃CPU的使用权,暂停或停止运行(如需要执行耗时的输入输出操作,将让出CPU的使用权,并暂时中止自己的执行,进入堵塞状态),堵塞时,线程不能进入排队队列,只有当堵塞的原因被消除后,线程才能转入就绪队列中排队等待,被CPU调度选中后会从原来停止的位置开始继续执行

注意:阻塞被消除后回到就绪状态,不是运行状态


Dead(死亡状态):线程调用stop()方法,destory()方法或run()方法执行结束后,线程就处于死亡状态,处于死亡状态下的线程不具有继续运行的能力

线程运行流程:


通过new关键字创建线程后,进入新生

调用start()方法后进入就绪状态

CPU调度到此线程后,此线程开始执行,就入到运行状态

运行中遇到join,yield,sleep造成阻塞,进入阻塞状态,阻塞原因消除后,又回到就绪状态

线程正常执行完毕或者异常中止后,进入死亡状态

造成线程阻塞的方法:


join,yield,sleep,Object的wait()方法


注意:


遇到join,yield,sleep,Object的等待wait()方法,synchronized,回到就绪状态


温馨提示:


大家可以通过getState()来获取线程当前的状态:


NEW 、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED


想要了解更多的线程知识,可以看看我写的上一篇线程与进程


目录
相关文章
|
1月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
8月前
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
|
9月前
|
Arthas IDE Java
一种获取阻塞线程栈帧数据的思路
一种获取阻塞线程栈帧数据的思路
133 2
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
143 0
|
5天前
|
前端开发 JavaScript
JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。
【6月更文挑战第22天】JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。回调是基础,用于在操作完成后执行函数;Promise管理异步状态,支持链式调用;async/await提供同步代码外观,简化错误处理。每种技术在处理耗时任务时都起着关键作用。
13 3
|
8天前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
|
30天前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
1月前
|
前端开发 JavaScript UED
由于JavaScript是单线程的,因此在处理大量异步操作时,需要确保不会阻塞UI线程
【5月更文挑战第13天】JavaScript中的Promise和async/await常用于处理游戏开发中的异步操作,如加载资源、网络请求和动画帧更新。Promise表示异步操作的结果,通过.then()和.catch()处理回调。async/await作为Promise的语法糖,使异步代码更简洁,类似同步代码。在游戏循环中,使用async/await可清晰管理资源加载和更新,但需注意避免阻塞UI线程,并妥善处理加载顺序、错误和资源管理,以保证游戏性能和稳定性。
36 3
|
1月前
|
存储 网络协议 iOS开发
connect永远阻塞线程及解决方案
connect永远阻塞线程及解决方案
22 0
|
1月前
|
监控
写一个线程来监控各线程是否发生阻塞
写一个线程来监控各线程是否发生阻塞
29 0

热门文章

最新文章

相关实验场景

更多