线程状态是五种还是六种

news2024/11/24 7:50:03

从操作系统层面上描述线程状态
在这里插入图片描述
在这里插入图片描述

  • 初始状态:仅仅是语言层面创建了线程对象,还没有与操作系统相关联.比如new 了一个Thread对象还没有调用start方法
  • 可运行状态:仅仅是语言层面创建了线程对象,还没有与操作系统相关联.比如new 了一个Thread对象还没有调用start方法
    • 这里运行状态和可运行状态是能进行上下文切换的,当CPU时间片用完了,线程就会从运行状态变为可运行状态.,导致线程上下文切换
  • 阻塞状态 : 该线程调用了一些阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,就会导致上下文切换,从运行状态变为阻塞状态.线程调度器不会分配给[阻塞状态线程]CPU时间片的,但是会分配给可运行状态的线程. 当读写文件操作完毕,会由操作系统来唤醒阻塞状态的线程, 就会从阻塞状态变为可运行状态
  • 终止状态:阻塞状态 : 该线程调用了一些阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,就会导致上下文切换,从运行状态变为阻塞状态.线程调度器不会分配给[阻塞状态线程]CPU时间片的,但是会分配给可运行状态的线程. 当读写文件操作完毕,会由操作系统来唤醒阻塞状态的线程, 就会从阻塞状态变为可运行状态

从java API层面上理解线程的6中状态
在这里插入图片描述
6种状态是JavaAPI层面上的.
根据Thread.State 枚举 ,分为6种状态.

  • NEW : 仅仅是语言层面创建了线程对象,还没有与操作系统相关联.比如new 了一个Thread对象还没有调用start方法
  • RUNNABLE : JavaAPI层面上状态涵盖了操作系统层面的[可运行状态],[运行状态] 和[阻塞状态]
    • RUNNABLE : JavaAPI层面上状态涵盖了操作系统层面的[可运行状态],[运行状态] 和[阻塞状态]
  • WAITING: 当调用线程的join方法,LockSupport.park()方法或者用synchronized(obj)获取了对象锁后,调用obj.wait()方法时.
  • TIMED_WAITING : 当用synchronized获取对象锁后,调用wait(long n)方法时候,当调用join(long n) ,调用sleep(long n),或者调用LockSupport的有时限的方法时
  • TERMINATED : 当当前线程的所有代码执行完成之后,表示线程已经执行完毕,生命周期已经结束了,不会再转换为其他状态.
@Slf4j(topic = "c.TestState")
public class TestState {
 
    public static void main(String[] args) {
        //NEW 状态 -> 没有调用start方法->只创建了线程对象没有启动该线程
        Thread t1 = new Thread(() -> {
            log.debug("running...");
        },"t1");
        //Runnable状态中的可运行状态
        Thread t2 = new Thread(() -> {
            while(true) {
 
            }
        },"t2");
        //TIMED_WAITING状态
        Thread t3 = new Thread(()->{
            synchronized (TestState.class) {
                try {
                    Thread.sleep(100000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t3");
        //WAITING状态
        Thread t4 = new Thread(()->{
            try {
                t2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t4");
        // ->终止状态
        Thread t5 = new Thread(()->{
           log.debug("running....");
        },"t5");
        //BLOCKED 状态
        Thread t6 = new Thread(()->{//后获取到锁
           synchronized (TestState.class) {
               log.debug("running");
           }
        },"t6");
        t2.start();
        t3.start();
        t4.start();
        t5.start();
        t6.start();
        System.out.println("t1 : " + t1.getState());
        System.out.println("t2 : " + t2.getState());
        System.out.println("t3 : " + t3.getState());
        System.out.println("t4 : " + t4.getState());
        System.out.println("t5 : " + t5.getState());
        System.out.println("t6 : " + t6.getState());
    }
}

在这里插入图片描述

线程的状态转换.
NEW --> RUNNABLE

当调用了 t.start()方法的时候,由NEW --> RUNNABLE

1.RUNNABLE <–> WAITING
t线程用synchronized(obj) 获取了对象锁之后

  • 调用了obj.wait()方法的时候,t线程就从 RUNNABLE --> WAITING
  • 调用了 obj.notify() ,obj.notifyAll() ,t.interrupt() 时候
    • 竞争锁成功,t线程从 WAITING --> RUNNABLE
    • 竞争锁失败,t线程从 WAITING --> BLOCKED
      比如两个线程竞争同一把锁,其中主线程使用notifyAll把它们全唤醒,那必然有一个线程竞争锁成功从WAITING --> RUNNABLE,必然有一个线程竞争锁失败从WAITING --> BLOCKED

2.RUNNABLE <–> WAITING

  • 当线程调用 t.join() 方法时,当前线程从 RUNNABLE --> WAITING
  • t线程运行结束,或者调用当前线程的interrupt()方法的时候,当前线程就从WAITING–>RUNNABLE状态

3.RUNNABLE <–> WAITING

  • 当前线程调用LockSupport.park()方法的时候会让当前线程从RUNNABLE–>WAITING
  • 当调用LockSupport.unpark方法或者调用线程的interrupt(),会让目标线程从WAITING–>RUNNABLE

1.RUNNABLE <–> TIMED_WAITING
当t线程调用了synchronized(obj) 获取了对象锁后

调用obj.wait(long n)方法时,t线程从RUNNABLE --> TIMED_WAITING

  • 当t线程等待时间超过了n毫秒,或调用obj.notify(),obj.notifyAll(),t.interrupt() 时
    • 竞争锁成功,t 线程从 TIMED_WAITING --> RUNNABLE
    • 竞争锁失败,t 线程从 TIMED_WAITING --> BLOCKED

2.RUNNABLE <–> TIMED_WAITING

  • 当前线程调用 t.join(long n) 方法时,当前线程从 RUNNABLE --> TIMED_WAITING
  • 当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从TIMED_WAITING --> RUNNABLE

3. RUNNABLE <–> TIMED_WAITING

  • 当前线程调用 Thread.sleep(long n) ,当前线程从 RUNNABLE --> TIMED_WAITING
  • 当前线程等待时间超过了 n 毫秒,当前线程从 TIMED_WAITING --> RUNNABLE

4.RUNNABLE <–> TIMED_WAITING

  • 当前线程调用 LockSupport.parkNanos(long nanos) 或 LockSupport.parkUntil(long millis) 时,当前线程从 RUNNABLE --> TIMED_WAITING
  • 调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从TIMED_WAITING–> RUNNABLE

RUNNABLE <–> BLOCKED

  • 当t线程用synchronized(obj)获取了对象锁时如果竞争失败就会从 RUNNABLE–>BLOCKED
  • 持有obj锁线程的同步代码块执行完毕,会唤醒该对向上的所有BLOKED的线程,如果其中t线程竞争成功,从BLOKED–>RUNNABLE ,其他失败的线程仍然是 BLOCKED.

RUNNABLE <–> TERMINATED
当当前线程的所有代码执行完成之后,表示线程已经执行完毕,生命周期已经结束了,不会再转换为其他状态.

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

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

相关文章

微服架构基础设施环境平台搭建 -(二)Docker私有仓库Harbor服务搭建

微服架构基础设施环境平台搭建 -&#xff08;二&#xff09;Docker私有仓库Harbor服务搭建 通过采用微服相关架构构建一套以KubernetesDocker为自动化运维基础平台&#xff0c;以微服务为服务中心&#xff0c;在此基础之上构建业务中台&#xff0c;并通过Jekins自动构建、编译、…

【数学杂记】表达式中的 s.t. 是什么意思

今天写题的时候遇见了这个记号&#xff1a;s.t.&#xff0c;查了一下百度。 s.t.&#xff0c;全称 subject to&#xff0c;意思是“使得……满足”。 比如这个&#xff1a; 意思是存在 i i i&#xff0c;使得 i i i 满足 A i ≠ B i A_i\neq B_i Ai​Bi​. 运用这个记号…

MySQL面试题1(索引)

目录 1.MySQL如何实现索引机制 1.1InnoDb与MyISAM索引实现区别是是什么&#xff1f; 1.2一个表中如果没有创建索引&#xff0c;还会创建B树么&#xff1f; 2.说一下B树索引实现原理&#xff08;数据结构&#xff09; 2.1聚簇索引和非聚簇索引在B树实现区别是什么&#xff1…

【Python每日一练】总目录(更新至2023.5.12)

Python 2023.05 2023.05.11-2023.05.12 20230512 1. 跳跃游戏 V 2. 跳跃游戏 VI 3. 跳跃游戏 VII 20230511 1. 跳跃游戏 Jump Game I 2. 跳跃游戏 Jump Game II 3. 跳跃游戏 Jump Game III 4. 跳跃游戏 Jump Game IV 2023.05.01-2023.05.10 20230510 1. 石子游戏 Ston…

[googletest] --- 简易使用教程

1 googletest下载/官方sample分析 1.1 googletest源码下载编译 源码下载编译 // 下载 git clone https://github.com/google/googletest // 现在官方已经把 gtest 和 gmock 一起维护&#xff0c;所以这个 git 仓库还包含了 gmock。// 编译、安装 cd googletest-main mkdir b…

【申请教程】ChatGPT访问互联网插件

https://openai.com/blog/chatgpt-plugins 大家好&#xff0c;我是章北海mlpy 申请ChatGPT插件很久了&#xff0c;一直没下文 最近看到两种套路&#xff0c;我早上试了一下&#xff0c;看能否快速成功吧。 方法一&#xff1a;用ChatGPT帮忙写申请文案 [外链图片转存失败,源…

大数据如何助力营销(2)用户画像

用户画像是指根据用户的数据&#xff0c;构建出用户的特征和兴趣&#xff0c;从而对用户进行分类和个性化的过程。用户画像可以帮助营销人员更有效地触达目标客户&#xff0c;提高营销效果和转化率。 用户画像的价值 用户画像的价值主要体现在以下几个方面&#xff1a; 提升用…

IP协议介绍

文章目录 一、IP协议的基本认识二、IP的协议头格式三、网段划分四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址 一、IP协议的基本认识 IP在网络分层中属于网络层协议&#xff0c;传输层协议里的TCP协议解决的是可靠性问题&#xff0c;网络层协议里的IP协议能…

VScode自动滚屏cin、input输入问题解决方法

文章目录 前言一、输出自动滚屏二、解决cin或input之类的输入问题总结 前言 VScode 是一个轻量的文本编辑器&#xff0c;微软出品。很多人把它作为主要开发工具写代码&#xff0c;因为它几乎是万能的&#xff0c;想要什么功能就装什么插件&#xff0c;可以适用于几乎任何编程语…

如何和AI聊天

AI产品工具目录&#xff1a;AI产品目录 Prompt 在和AI聊天时&#xff0c;你得表明你需要啥&#xff0c;并且描述的越精确&#xff0c;AI回答的就越贴近你的预期&#xff0c;简单的对话&#xff0c;可以自己尝试&#xff0c;但是如果想做应用级别的就得学习这种聊天技术&#…

Flask celery异步发送邮件

首先安装celery pip install celery安装redis 一、Redis for Windows下载 之前微软维护了一份Windows版本的Redis&#xff0c;但是版本停留在3.2&#xff0c;并且也关闭了项目更新渠道。这里我们使用另外一位大神提供的Windows Redis&#xff0c;更新及时&#xff0c;用户量也…

[VAE] Auto-Encoding Variational Bayes

直接看paper看得云里雾里&#xff0c;李沐视频一语道破天机&#xff08;建议从30min左右开始看GAN到Diffusion的串讲&#xff09;。VAE的核心思路就是下面&#xff1a; 做生成&#xff0c;其实就是从随机向量&#xff08;z&#xff09;到目标图像&#xff08;x&#xff09;的过…

研报精选230512

目录 【行业230512山西证券】有色金属行业周报&#xff1a;基本金属普跌&#xff0c;锂价持续回弹 【行业230512湘财证券】新材料行业周报&#xff1a;五一前后各板块震荡下行&#xff0c;节后稀土价格跌后企稳&#xff0c;锂源现止跌迹象 【行业230512山西证券】基础化工2022年…

obj导入unity顶点数量改变

obj文件&#xff0c;是个cube&#xff0c;里面有8个顶点12个面。 # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware # 创建的文件:11.04.2023 13:05:22# # object Box001 #v -15.0000 -15.0000 15.0000 v -15.0000 -15.0000 -15.0000 v 15.0000 -15.0000 -15.0…

C高级-day(5)-(分支语句、循环结构、函数....)

题目一、 有m1.txt m2.txt m3.txt m4.txt&#xff0c;分别创建出对应的目录&#xff0c;m1 m2 m3 m4 并把文件移动到对应的目录下 #! /bin/bashtouch m1.txt m2.txt m3.txt m4.txt for i in seq 1 1 4 domkdir m$imv m$i.txt m$i done 题目二、 使用break关键字打印九九乘法…

BERT-pytorch源码分析

​学习bert可以下载一些数据集练练手&#xff0c;目前打算选择官网给出GLUE的数据集。 bert整体代码框架结构如下&#xff1a; 首先从main文件开始解读&#xff0c;打开__main__.py。这里面只有import导入语句和一个train函数。 train函数里面首先是对一些路径参数的填写&a…

unity用ComputeShader做模型流体喷涂喷绘工具

最近在研究喷涂喷绘项目&#xff0c;需要做大量纹理图形运算&#xff0c;因此更适合用GPU来处理&#xff0c;在unity中用ComputeShader完成像素运算&#xff0c;SurfaceShader完成纹理渲染。 实现思路&#xff1a; 1.用射线碰撞模型&#xff0c;得到碰撞纹理坐标brushX和brus…

PMP课堂模拟题目及解析(第8期)

71. 项目经理负责管理一个处于执行阶段的项目&#xff0c;并希望审查项目范围以进行成本结算&#xff0c;项目经理发现在工作分解结构&#xff08;WBS &#xff09;中遗漏了一项可交付成果。项目经理下一步应该怎么做&#xff1f; A. 询问干系人是否需要添加这些遗漏的可交付…

【18】SCI易中期刊推荐——计算机科学(中科院2区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

【LeetCode】209.长度最小的子数组

209. 长度最小的子数组 思路一&#xff1a;暴力解法 通过两个for循环&#xff0c;从头开始找符合条件的子序列。暴力解法无法通过本题&#xff0c;超出时间限制&#xff0c;所以仅供参考。 代码如下&#xff1a; 暴力解法1&#xff1a;下面的代码是通过申请一个新的数组&#x…