【Java基础】 线程状态转化

news2024/11/16 23:32:35

Java 中的线程状态转换是指线程在其生命周期中可以经历的不同状态以及这些状态之间的转换。了解线程的状态转换对于有效地管理和调试多线程应用程序非常重要。Java 提供了 Thread.State 枚举来描述线程的状态。

状态

  1. NEW(新建)

    • 线程被创建,但尚未启动。
    • 线程对象已被创建,但 start() 方法尚未被调用。
  2. RUNNABLE(就绪/运行)

    • 线程已经启动,并且正在等待 CPU 调度或正在执行。
    • 在操作系统层面,Java 线程可能被映射到不同的实际运行状态,但在 Java 虚拟机(JVM)中,这些状态被统一表示为 RUNNABLE
  3. BLOCKED(阻塞)

    • 线程被阻塞,等待进入一个同步块/方法。
    • 当线程试图获取一个锁而该锁被另一个线程持有时,线程进入 BLOCKED 状态。
  4. WAITING(等待)

    • 线程在等待另一个线程执行特定操作(如通知或中断)。
    • 线程通过调用 Object.wait()Thread.join()LockSupport.park() 等方法进入 WAITING 状态。
  5. TIMED_WAITING(计时等待)

    • 线程在等待另一个线程的特定操作的同时,也在等待特定的时间。
    • 线程通过调用 Thread.sleep()Object.wait(long timeout)Thread.join(long millis) LockSupport.parkNanos() 等方法进入 TIMED_WAITING 状态。
  6. TERMINATED(终止)

    • 线程已完成执行。
    • 线程正常完成或因未捕获的异常而终止,进入 TERMINATED 状态。

 

线程状态转化图

 

状态转换的详细说明 

  • 从 NEW 到 RUNNABLE

    调用 Thread.start() 方法,线程从 NEW 状态转换到 RUNNABLE 状态。

  • 从 RUNNABLE 到 BLOCKED

    当线程尝试获取一个锁(通过 synchronized 关键字或显式锁)但锁被其他线程持有时,线程从 RUNNABLE 转换到 BLOCKED

  • 从 BLOCKED 到 RUNNABLE

    当线程成功获取到锁时,线程从 BLOCKED 转换到 RUNNABLE

  • 从 RUNNABLE 到 WAITING

    线程调用 Object.wait()Thread.join() LockSupport.park() 方法进入 WAITING 状态,等待其他线程的通知或中断。

  • 从 WAITING 到 RUNNABLE

    线程被其他线程通过 Object.notify()Object.notifyAll()Thread.interrupt()LockSupport.unpark() 方法唤醒,重新进入 RUNNABLE 状态。

  • 从 RUNNABLE 到 TIMED_WAITING

    线程调用 Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis) LockSupport.parkNanos(long nanos) 等方法进入 TIMED_WAITING 状态,等待特定的时间。

  • 从 TIMED_WAITING 到 RUNNABLE

    等待时间结束或线程被唤醒后,线程从 TIMED_WAITING 转换到 RUNNABLE

  • 从 RUNNABLE 到 TERMINATED

    线程执行完 run() 方法或抛出未捕获的异常,线程从 RUNNABLE 转换到 TERMINATED

 

代码示例 

public class ThreadStateDemo {
    public static void main(String[] args) {
        // 创建一个新线程
        Thread thread = new Thread(() -> {
            try {
                // 输出当前线程的状态(RUNNABLE)
                System.out.println("Thread State: " + Thread.currentThread().getState());
                // 让线程休眠1秒(TIMED_WAITING)
                Thread.sleep(1000);
                // 同步代码块,等待1秒(TIMED_WAITING)
                synchronized (ThreadStateDemo.class) {
                    ThreadStateDemo.class.wait(1000);
                }
                // 输出当前线程的状态(RUNNABLE)
                System.out.println("Thread State: " + Thread.currentThread().getState());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 输出主线程的状态(NEW)
        System.out.println("Thread State: " + thread.getState());
        // 启动新线程
        thread.start();
        // 输出新线程的状态(RUNNABLE,取决于CPU调度)
        System.out.println("Thread State: " + thread.getState());

        try {
            // 主线程休眠500毫秒,确保新线程进入TIMED_WAITING状态
            Thread.sleep(500);
            // 输出新线程的状态(TIMED_WAITING)
            System.out.println("Thread State: " + thread.getState());
            // 等待新线程结束
            thread.join();
            // 输出新线程的状态(TERMINATED)
            System.out.println("Thread State: " + thread.getState());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1839377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STemWin在Windows上仿真运行环境配置

文章目录 一、STemWin介绍二、emWin必用的2个工具2.1 PC仿真器2.2 GUIBuilder图形化设计工具三、安装VS2022四、打开emwin仿真工程五、常见的配置修改5.1 运行内存修改5.2 LCD显示屏尺寸的修改一、STemWin介绍 emWin(Embedded Wizard Graphics Library)是Segger公司开发的嵌…

深入二进制安全:全面解析Protobuf

前言 近两年,Protobuf结构体与Pwn结合的题目越来越多。 23年和24年Ciscn都出现了Protobuf题目,24年甚至还出现了2道。 与常规的Pwn题利用相比,只是多套了一层Protobuf的Unpack操作。 本文包含Protobuf环境安装、相关语法、编译运行以及pb…

软件工程考试题备考

文章目录 前言一、二、1.2 总结 前言 一、 B D C 类图、对象图、包图 其他系统及用户 功能需求 用例 人、硬件或其他系统可以扮演的角色7. D C 数据 原型/系统原型;瀑布 A 功能;功能需求 D 数据存储;圆形/圆角矩形;矩形 C T;T;F C C B C D C …

2024年应用科学、航天航空与核科学国际学术会议(ICASANS 2024)

2024年应用科学、航天航空与核科学国际学术会议(ICASANS 2024) 2024 International Academic Conference on Applied Science, Aerospace and Nuclear Science(ICASANS 2024) 会议简介: 在科技日新月异的今天&#xf…

xcode报错合集,你都遇到过哪些跳不过的坑

1.报错Consecutive declarations on a line must be separated by ; 其实我这里是用因为创建了一个结构体,然后在没有使用State的情况下,修改它的属性了 当然加上State依然报错: 应该在UI事件中修改:

Go 1.19.4 字符串-Day 06

1. 编码表 计算机中只有数字(0和1),如果有一个字符串(字符串由字符组成)要存储,在内存中该如何表达这个字符串? 那么所有的字符都必须数字化,也就是一个字符对应一个特定的数字&…

龙虎斗(2018)c++

题目描述 输入 输出 样例输入,输出 输入 #1 输出 #1 6 2 2 3 2 3 2 3 4 6 5 2 输入 #2 输出 #2 6 …

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策,自2024年6月10日起,允许买家在商品仍在运输途中申请退货与退款,此即“在途退货/退款”功能,主要的目的是为了提升买家的购物体验,增强市场竞争力。 图源:Shopee菲律…

使用vue组件的执行顺序

使用vue组件的执行顺序 public中index.html是整个应用的入口文件,当需要把app容器挂载页面上时,按照递归的方式找到app,也就是vue的入口文件,main.js;当找到设计其他子组件定义的内容时,会递归的找到其他子组件。 在子…

七款上网行为管理系统推荐|上网管理系统高能推荐

电脑监控审计软件,听起来可能有些高冷、专业,但它们其实就是守护你电脑的小精灵!这些软件工具可是专门设计来监控和记录你的电脑使用情况,无论你是企业里的辛勤员工,还是学校里的学霸小伙伴,都能找到它们的…

Agentic RAG 与图任务编排

一个朴素的 RAG 系统流程是这样的:先由用户提出问题,然后系统基于用户提问进行召回,对召回结果进行重排序,最后拼接提示词后送给 LLM 生成答案。 一部分简单场景下,朴素的 RAG 已经可以满足用户意图明确的场景的要求&a…

柒拾肆- 如何通过数据影响决策(五)- 时序数据

什么是好? 对于 单一时序指标 来说(如最简单的 销售、日活顾客数、订单数 等 ),在决策时该怎样 看 呢? 或者换句话说,数据 应该怎样 表达 才能让决策者做出 更全面 的决策呢? 一、目前的方式 …

Jenkins+K8s实现持续集成(二)

部署前呢,要先把jenkins搭建好。 同时呢已经有了k8s的环境。 基于以上两步已经有了的情况,继续要实现jenkinsk8s持续集成,需要先准备四个文件: Dockerfile首先要准备好一个Dockerfile文件,用于构建Docker镜像的文本…

广州回顾 | 打破Oracle与IvorySQL之间的壁垒,听听IvorySQL企业级应用

6月15日,IvorySQL 社区携手中国开源软件联盟 PostgreSQL 分会首次走进广州并成立 IvorySQL 广州用户组,非常感谢 PG分会 筹办了此次线下交流活动,这也让 IvorySQL 社区有机会在线下与广州的小伙伴们一起见面聊聊天。 与一群志同道合的人相聚&…

c#音乐播放器续(联网下载)

音乐播放器 0.前言1.关于本地音乐播放2.使用iTunes Search API进行联网下载歌曲2.1 控件2.2 函数实现2.2.1 控件2:搜索歌曲2.2.2 控件3:下载歌曲 2.3 主界面 3.拓展 0.前言 书接上文,我们已经实现了一个能够播放本地音乐的音乐播放器&#x…

kubernetes 核心概念

1 kubernetes核心概念 1.1 Pod Pod是可以在Kubernetes中创建和管理的、最小的可部署的计算单元。 Pod就像豌豆荚一样,其中包含着一组(一个或多个)容器;这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod就像一台物理…

用c语言实现通讯录

目录 静态简易通讯录 代码: 功能模块展示: 设计思路: 动态简易通讯录(本质顺序表) 代码: 扩容模块展示: 设计思路: 文件版本通讯录 代码: 文件模块展示&#x…

运维篇-配置高级

黑马程序员Spring Boot2 文章目录 1、临时属性1.1 命令行中使用临属性1.2 开发环境设定临时属性 2、配置文件分类3、自定义配置文件 1、临时属性 1.1 命令行中使用临属性 使用jar命令启动Sprigboot工程师可以使用临时属性替换配置文件中的属性临时属性添加方式:ja…

数据结构——排序(期末总结)

1. 插入排序 1.1 直接插入排序 思想 假设第一个元素是已经排好序的元素&#xff0c;从第二个元素开始依次插入操作&#xff0c;大的放后面&#xff0c;小的放前面。 代码 void insert(int a[], int n) {int i, j, key;for (i 2; i < n; i){key a[i];j i - 1;while (j…

SCI绘图【1】-不同颜色表示密度和差异--密度图

参考资料&#xff1a;密度图&#xff08;Density Plot&#xff09; - 数据可视化图表 - 数字孪生百科 密度图是快速观察变量数值分布的有效方法之一。通常情况下&#xff0c;会根据两个变量将平面绘图区域分为非常多的子区域&#xff0c;之后以不同颜色表示落在该区域上样本的…