线程各种状态转换分析

简介: 线程在它的生命周期中会处于各种不同的状态:新建、等待、就绪、运行、阻塞、死亡。

微信图片_20220430220645.png


线程在它的生命周期中会处于各种不同的状态:新建、等待、就绪、运行、阻塞、死亡。


1、新建


用new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。


2、等待


当线程在new之后,并且在调用start方法前,线程处于等待状态。


3、就绪


当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。


4、运行状态


处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。


只有处于就绪状态的线程才有机会转到运行状态。


5、阻塞状态


阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。


6、死亡状态


当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。


由于java线程调度不是分时的,如果程序希望干预java虚拟机对线程的调度过程,从而明确地让一个线程给另外一个线程运行的机会,可以采用以下的方法


1、调整各个线程的优先级


2、让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态


sleep方法可能抛出InterruptedException


线程休眠后只能在指定的时间后使线程处于就绪状态。(也就是等待cpu的调度)


3、让处于运行状态的线程调用Thread.yield()方法,只会同优先级让步或更高优先级让步(进入就绪状态)


4、让处于运行状态的线程调用另一个线程的join()方法


当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行。


通过一下几种途径中的一种,线程可以从被阻塞状态到可运行状态。


1、线程被置于睡眠状态,且已经经过指定的毫秒数。


2、线程正在等待I/O操作的完成,且该操作已经完成。


3、线程正在等待另一个线程所持有的锁,且另一个线程已经释放该锁的所有权;(也有可能等待超时。当超时发生时,线程解除阻塞。)


4、线程正在等待某个触发条件,且另一个线程发出了信号表明条件已经发生了变化。(如果为线程的等待设置了一个超时,那么当超时发生时该线程将解除阻塞。)


5、线程已经被挂起,且有人调用了它的resume方法。不过由于suspend方法已经过时,resume方法也就随之被弃用了,你不应该在自己的代码里调用它。(现在应该用sleep取而代之。)

相关文章
|
2月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
60 1
|
2月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
81 0
|
21天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
39 4
|
6月前
|
存储 SQL 监控
JAVA 线程池的分析和使用
JAVA 线程池的分析和使用
44 0
|
3月前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。
|
4月前
|
存储 监控 Java
|
4月前
|
安全 Java 开发者
Swing 的线程安全分析
【8月更文挑战第22天】
72 4
|
4月前
|
Java 数据库连接 数据库
当线程中发生异常时的情况分析
【8月更文挑战第22天】
132 4
|
4月前
|
安全 Java 程序员
线程安全与 Vector 类的分析
【8月更文挑战第22天】
84 4
|
4月前
|
存储 缓存 安全
深度剖析Java HashMap:源码分析、线程安全与最佳实践
深度剖析Java HashMap:源码分析、线程安全与最佳实践