线程状态转换总结

news2024/7/6 20:51:04

1. NEW -> RUNNABLE

  • 创建线程后是 NEW 状态(只是 Java 层面新建的,还没有关联到操作系统实际的线程上),调用线程的 start() 方法会将 Java 线程和操作系统的线程关联起来,进入 RUNNABLE 状态

2. RUNNABLE <-> WAITTING

  • wait/notify
    • 线程 t 获取到锁之后调用 obj.wait(),进入 WAITTING
    • 调用 obj.notify() obj.notifyAll() obj.interrupt() 唤醒线程,线程竞争锁,竞争成功进入 RUNNABLE,竞争失败进入 BLOCKED 状态
  • join
    • 当前线程调用 t.join() 方法,当前线程由 RUNNABLE -> WAITTING,注意是当前线程在 t 线程对象的监视器上等待

问题?当前线程在线程 t 的锁对象上等待,释放时候不需要去抢夺锁,怎么标识不去抢夺?只是需要等待 t 线程运行结束,然后自己继续运行就好了

  • t 线程运行结束或者调用了 t.interrupt() 方法,当前线程 从 WAITTING -> RUNNABLE
  • park/unpark
    • 当前线程调用 LockSupport.park() 回让当前线程由 RUNNABLE -> WAITTING
    • 当前线程调用 LockSupport.unpark(目标线程),或者线程的 interrupt(),会让目标线程从 WAITTING -> RUNNABLE

3. RUNNABLE <-> TIMED_WAITTING

  • wait(timeout)(先获取到对象锁)
    • 调用 wait(timeout) 进入 TIMED_WAITTING 状态
    • timeout 时间到期,从 TIMED_WAITTING -> RUNNABLE
    • 调用 obj.notify() obj.notifyAll() obj.interrupt() 唤醒线程,线程竞争锁,竞争成功进入 RUNNABLE,竞争失败进入 BLOCKED 状态
  • join(timeout)
  •  sleep(timeout)
  • park(timeout)

4. RUNNABLE <-> BLOCKED

  • 运行线程竞争锁失败 synchronized(obj),从 RUNNABLE -> BLOCKED
  • 持有锁 obj 的线程同步代码块执行完毕,释放锁会唤醒阻塞在该对象锁上的所有线程(BLOCKED 状态),线程重新竞争锁,竞争成功由 BLOCKEDE -> RUNNABLE,竞争失败还是 BLOCKED

5. RUNNABLE -> TERMINATED

  • 当前线程执行完毕,进入终止状态

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

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

相关文章

入门PHP就来我这(纯干货)05

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 数组及创建 数组&#xff0c;顾名思义&#xff0c;本质上就是一系列数据的组合…

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢&#xff1f;我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继…

docker-compose搭建prometheus、grafana

一、安装prometheus 1、安装 version: 3.1services:prometheus:image: prom/prometheus:v2.48.0container_name: prometheushostname: prometheusrestart: alwaysvolumes:- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml- ./prometheus/:/etc/prometheus/port…

淘宝扭蛋机小程序开发,新玩法、新收益体验!

近几年&#xff0c;随着娱乐消费的火爆&#xff0c;潮玩市场得到了快速发展&#xff0c;从而带动了扭蛋机市场的发展&#xff0c;扭蛋机也逐渐风靡在消费市场中。对于年轻人消费者来说&#xff0c;愿意为扭蛋机的热门IP商品而买单。目前&#xff0c;价格低、颜值高、种类多样的…

大科技公司大量裁员背后的真相

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

试用笔记之-汇通计算机等级考试软件一级Windows

首先下载汇通计算机等级考试软件一级Windows http://www.htsoft.com.cn/download/htwork.rar

JavaMySQL 学习(基础)

目录 Java CMD Java发展 计算机存储规则 Java学习 switch新用法&#xff08;可以当做if来使用&#xff09; 数组定义 随机数 Java内存分配 MySQL MySQL概述 启动和停止 客户端连接 数据模型 关系型数据库 SQL SQL通用语法 SQL分类 DDL--数据定义语言 数据库…

时间复利效应才是人生的催化剂

在追求成功的道路上&#xff0c;许多人都在寻找捷径。然而&#xff0c;真正的捷径并非不劳而获的幻想&#xff0c;而是通过长期坚持在某一领域深耕细作&#xff0c;享受时间复利效应带来的巨大收益。本文将探讨如何选择合适的领域并长期坚持下去&#xff0c;以实现成功。 时间…

Agent 学习笔记

近年来&#xff0c;人工智能领域取得了重大进展&#xff0c;人工智能代理现在能够处理复杂的任务。尽管取得了这些进展&#xff0c;但有效地并行和协调多个人工智能代理协同工作仍然是一个挑战。 一群智能体可以理解为一组智能体在单个环境中共同共存&#xff0c;该环境可以相…

不用找了!这个软件自带各行业话术,客服效率飞跃

有一款客服工具软件&#xff0c;不但能吸附聊天窗口&#xff0c;实现图文视频话术的一键发送&#xff0c;还内置了多行业的优质客服话术模板&#xff0c;允许用户直接下载使用&#xff0c;快速构建起适合自身企业的专业客服知识库。 前言 在今天的快节奏商业环境中&#xff0c…

The Sandbox 通过创作者挑战赛推动社区参与

游戏开发者并不是每天都有机会让自己的作品赢得大奖。但在 The Sandbox&#xff0c;这已经成为一种趋势&#xff01;首届 "创作者挑战赛 "让顶尖创作者将 150 万 SAND 捧回家。现在&#xff0c;我们要带着另一个巨额奖池回来了&#xff01; 关于首届创作者挑战赛&…

PCIe Switch

如图所示&#xff0c;pcie Switch 被定义为多个虚拟PCI-to-PCI Bridge设备的逻辑集合。所有交换机由以下基本规则管理。 . Switch在配置软件中表现为两个或多个逻辑PCI-to-PCI桥 不需要支持下行端口作为锁定请求的发起端口. 每个enable的端口必须符合“流量控制”规范。 .S…

aclStream流处理多路并发Pipeline框架中VEncode Module代码调用流程整理、类的层次关系整理、回调函数赋值和调用流程整理

目录 1 代码调用详细流程 2 类的层次关系 3 回调函数的赋值和调用流程 参考文献&#xff1a; 将寒武纪的CNStream适配到华为昇腾平台&#xff0c;并起名aclStream&#xff0c;整理了下华为昇腾平台aclStream中VEncode Module的代码调用流程、类的层次关系以及回调函数的赋值…

(九)绘制彩色三角形

前面的学习中并未涉及到颜色&#xff0c;现在打算写一个例子&#xff0c;在顶点着色器和片元着色器中加入颜色&#xff0c;绘制有颜色的三角形。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void …

数据加密解密和哈希的解析

[S1301]数据的加解密 对提供的原始数据&#xff08;字符串或者二进制数组&#xff09;进行加密是数据保护框架体提供的基本功能&#xff0c;接下来我们利用一个简单的控制台程序来演示一下加解密如何实现。数据的加解密均由IDataProtector对象来完成&#xff0c;而该对象由IDa…

React+TS 从零开始教程(4):useEffect

上一节传送门&#xff1a;ReactTS 从零开始教程&#xff08;3&#xff09;&#xff1a;useState 源码链接&#xff1a;https://pan.quark.cn/s/c6fbc31dcb02 上一节&#xff0c;我们已经学会了React的第一个Hook&#xff1a;useState。 这一节&#xff0c;我们要学习的是另一…

2024年江西省研究生数学建模竞赛A题交通信号灯管理论文和代码分析

经过不懈的努力&#xff0c;2024年江西省研究生数学建模竞赛A题论文和代码已完成&#xff0c;代码为A题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模…

作业7.2

用结构体数组以及函数完成: 录入你要增加的几个学生&#xff0c;之后输出所有的学生信息 删除你要删除的第几个学生&#xff0c;并打印所有的学生信息 修改你要修改的第几个学生&#xff0c;并打印所有的学生信息 查找你要查找的第几个学生&#xff0c;并打印该的学生信息 1 /*…

Qt中使用MySQL数据库详解,好用的模块类封装

本文将详细介绍如何在Qt应用程序中集成MySQL数据库&#xff0c;并封装实现好用的mysql数据库操作类。包括环境准备、连接数据库、执行查询及异常处理等关键步骤&#xff0c;同时包含mysql驱动的编译。分享给有需要的小伙伴&#xff0c;喜欢的可以点击收藏。 目录 环境准备 项…

scikit-learn教程

scikit-learn&#xff08;通常简称为sklearn&#xff09;是Python中最受欢迎的机器学习库之一&#xff0c;它提供了各种监督和非监督学习算法的实现。下面是一个基本的教程&#xff0c;涵盖如何使用sklearn进行数据预处理、模型训练和评估。 1. 安装和导入包 首先确保安装了…