线程有哪些状态

news2024/10/6 17:20:52

线程的生命周期

线程在Java中有以下几种状态:

  1. 新建(New):初始化状态
  2. 就绪(Runnable):可运行、运行状态
  3. 阻塞(Blocked):等待状态,无时限
  4. 等待(Waiting):等待状态,有时限
  5. 超时等待(Timed Waiting):就绪状态
  6. 终止(Terminated):终止状态
     

线程状态枚举代码


    public static enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;

        private State() {
        }
    }

线程的状态流转图

线程各个状态说明

新建(New):当线程对象被创建但还没有调用start()方法时,线程处于新建状态。

就绪(Runnable):一旦线程调用了start()方法,它进入就绪状态。线程处于就绪状态时,表示它已经准备好被JVM调度执行,只是还没有得到CPU的时间片。

  1. 就绪状态只是说你自个儿运行,调度程序没有挑选到你,你就永远是就绪状态。
  2. 调用线程的start()方法,此线程进入就绪状态。
  3. 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
  4. 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
  5. 锁池里的线程拿到对象锁后,进入就绪状态。

运行(Running):当线程获得CPU时间片并开始执行时,它进入运行状态。

阻塞(Blocked):线程因为某些原因放弃CPU使用权,暂时停止运行,进入阻塞状态。比如线程在等待某个资源,或者调用了sleep()、wait()等方法。

  1. 阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)之前时的状态。

等待(Waiting):线程进入等待状态,表示它正在等待其他线程做出一些特定动作(通常是通知或中断)。

  1. 调用sleep或是wait方法后线程处于WAITING状态,等待被唤醒。

超时等待(Timed Waiting):线程在等待指定的时间后会自动转为就绪状态。

  1. 调用sleep或是wait方法后线程处于TIMED_WAITING状态,等待被唤醒或时间超时自动唤醒。

终止(Terminated):线程执行完任务后或者因异常退出了run()方法,进入终止状态。

  1. 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
  2. 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

线程状态之间的转换

NEW到RUNNABLE 状态

        线程从NEW状态到RUNNABLE状态的转换通常发生在调用start()方法后。当线程对象被创建时,处于NEW状态,一旦调用start()方法,线程就会进入就绪(RUNNABLE)状态。在就绪状态下,表示线程已经准备好被JVM调度执行,只是还没有得到CPU的时间片。一旦获得CPU时间片,线程就会进入运行状态,开始执行其对应的run()方法中的代码。

RUNNABLE与BLOCKED 的状态转换

        线程从RUNNABLE状态到BLOCKED状态的转换通常发生在线程等待获取某个锁资源时。当一个线程在运行过程中,需要访问一个被其他线程持有的锁时,它会进入BLOCKED状态。这可能是因为其他线程已经获取了该锁,并且当前线程需要等待其他线程释放锁才能继续执行。

        具体来说,当一个线程在尝试获取一个锁时,如果锁已经被其他线程持有,那么当前线程将由RUNNABLE状态转换为BLOCKED状态。一旦其他线程释放了锁,当前线程将重新进入就绪状态,等待系统分配CPU资源,然后再次尝试获取锁并进入运行状态。

        这种状态转换通常涉及多线程的并发操作,开发者需要合理地设计和管理锁资源,以避免线程因争夺锁而频繁进入BLOCKED状态,影响程序的性能和并发效率

RUNNABLE与WAITING 的状态转换

        线程从RUNNABLE状态到WAITING状态的转换通常发生在调用了Object类的wait()方法或Thread类的join()方法时。

        当一个线程调用了Object类的wait()方法后,该线程会释放占有的锁并进入WAITING状态,等待其他线程通过notify()或notifyAll()方法来唤醒它。在WAITING状态下,线程不会争夺CPU资源,只有当其他线程显式地唤醒它后,才有机会重新进入就绪状态。

        另外,当一个线程调用了Thread类的join()方法后,它会等待被调用线程执行完毕。在调用线程的join()方法后,调用线程会进入WAITING状态,直到被调用线程执行完毕才会重新进入就绪状态。

        需要注意的是,线程从WAITING状态到RUNNABLE状态的转换是由其他线程显式地唤醒或被调用线程执行完毕触发的,而不是自动发生的。这种状态转换多用于线程间的协作和同步操作,通过合理地使用wait()、notify()、join()等方法可以实现线程间的通信和协调。

RUNNABLE到TIMED TERMINATED 状态

        线程从RUNNABLE状态到Timed Waiting状态的转换通常发生在调用了带有时间限制的等待方法,如Thread类的sleep(long millis)方法或Object类的wait(long timeout)方法。

        当一个线程调用sleep(long millis)方法后,线程会进入Timed Waiting状态。在指定的时间段内,线程不会争夺CPU资源,而是处于休眠状态。一旦指定的时间过去,线程会重新进入就绪状态,等待系统分配CPU资源并继续执行。

        另外,当一个线程调用了Object类的wait(long timeout)方法后,线程会释放占有的锁并进入Timed Waiting状态,等待其他线程通过notify()或notifyAll()方法来唤醒它,或者等待指定的时间段过去。如果指定的时间段内没有其他线程唤醒它,那么线程会自动重新进入就绪状态。

        需要注意的是,线程从Timed Waiting状态到RUNNABLE状态的转换是由时间限制或其他线程的唤醒操作触发的。在Timed Waiting状态下,线程会等待一段时间或者被其他线程显式地唤醒后,才有机会重新进入就绪状态。

        这种状态转换通常用于线程间的时间控制和同步操作,通过合理地使用sleep()、wait()等方法可以实现线程的定时等待和协调。

RUNNABLE到TERMINATED 状态

        线程从RUNNABLE状态到TERMINATED状态的转换通常发生在线程执行完任务或由于异常退出时。

        当一个线程处于RUNNABLE状态并且执行完了其run()方法中的代码,即任务完成时,线程会自动进入TERMINATED状态。在TERMINATED状态下,线程已经结束执行,不再具有任何运行状态。

        另外,如果线程在执行过程中发生了未捕获的异常导致线程提前退出,也会使线程从RUNNABLE状态转换为TERMINATED状态。

        需要注意的是,TERMINATED状态是最终状态,一旦线程进入该状态,就无法再回到其他状态。如果需要重新执行线程任务,必须创建一个新的线程对象并启动。

        控制线程状态的转换是由JVM和操作系统来管理的,开发者可以通过合理的编码和使用线程控制方法来影响线程状态的转换,确保线程能够按照预期执行和完成任务。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

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

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

相关文章

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

您的计算机已被Mallox勒索病毒感染?恢复您的数据的方法在这里!

尊敬的读者&#xff1a; 随着科技的迅速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒是一种极具威胁性的恶意软件。在这些勒索病毒中&#xff0c;.mallox 勒索病毒尤为突出&#xff0c;它能够加密用户的数据文件&#xff0c;要求支付赎金才能解密。本文将介…

高效使用 PyMongo 进行 MongoDB 查询和插入操作

插入到集合中&#xff1a; 要将记录&#xff08;在MongoDB中称为文档&#xff09;插入到集合中&#xff0c;使用insert_one()方法。insert_one()方法的第一个参数是一个包含文档中每个字段的名称和值的字典。 import pymongomyclient pymongo.MongoClient("mongodb://l…

笔试题之指针和数组的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Ubuntu 和 Windows 文件互传

FTP 服务 FTP 采用 Internet 标准文件传输协议 FTP 的用户界面&#xff0c; 向用户提供了一组用来管理计算机之间文件传输的应用程序。在开发的过程中会频繁的在 Windows 和 Ubuntu 下进行文件传输&#xff0c;比如在 Windwos 下进行代码编写&#xff0c;然后将编写好的代码拿到…

JavaEE初阶(18)(JVM简介:发展史,运行流程、类加载:类加载的基本流程,双亲委派模型、垃圾回收相关:死亡对象的判断算法,垃圾回收算法,垃圾收集器)

接上次博客&#xff1a;初阶JavaEE&#xff08;17&#xff09;Linux 基本使用和 web 程序部署-CSDN博客 目录 JVM 简介 JVM 发展史 JVM 运行流程 JVM的内存区域划分 JVM 执行流程 堆 堆的作用 JVM参数设置 堆的组成 垃圾回收 堆内存管理 类加载 类加载的基本流…

Windows conan环境搭建

Windows conan环境搭建 1 安装conan1.1 安装依赖软件1.1.1 python安装1.1.2 git bash安装1.1.3 安装Visual Studio Community 20191.1.3.1 选择安装的组件1.1.3.2 选择要支持的工具以及对应的SDK 1.1.4 vscode安装 1.3 验证conan功能1.4 查看conancenter是否包含poco包1.5 查看…

SQL 日期函数

在数据库中&#xff0c;日期和时间是经常需要处理的数据类型之一。SQL提供了许多内置的日期函数&#xff0c;用于对日期和时间进行操作、计算和比较。这些函数可以帮助我们提取日期的各个部分&#xff08;如年份、月份、日、小时、分钟等&#xff09;&#xff0c;执行日期的转换…

第一百七十二回 SegmentedButton组件

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SearchBar组件"相关的内容&#xff0c;本章回中将 介绍SegmentedButton组件.闲话休提&#xff0c;让我们一起Tal…

抖斗音_快块手直播间获客助手+采集脚本+引流软件功能介绍

软件功能&#xff1a; 支持同时采集多个直播间&#xff0c;弹幕&#xff0c;关*注&#xff0c;礼*物&#xff0c;进直播间&#xff0c;部分用户手*号,粉*丝团采集 不支持采集匿*名直播间 设备需求&#xff1a; 电脑&#xff08;win10系统&#xff09; 文章分享者&#xff1…

【Linux】第十五站:环境变量

文章目录 一、进程相关的一些概念1.一些常见的概念2.对于并发3.**进程切换** 二、环境变量1.PATH环境变量2.HOME环境变量3.SHELL环境变量4.env5.系统调用接口与环境变量6.什么是环境变量&#xff1f;7.命令行参数8.main函数的第三个命令行参数9.如何验证环境变量是可以被继承的…

java实现选择排序

图解 以下是Java实现选择排序的示例代码&#xff1a; public class SelectionSort {public static void selectionSort(int[] arr) {int n arr.length;// 遍历未排序部分的数组for (int i 0; i < n - 1; i) {// 在未排序部分中查找最小元素的下标int minIndex i;for (in…

MySQL 人脸向量,欧几里得距离相似查询

前言 如标题&#xff0c;就是通过提取的人脸特征向量&#xff0c;写一个欧几里得 SQL 语句&#xff0c;查询数据库里相似度排前 TOP_K 个的数据记录。做法虽然另类&#xff0c;业务层市面上有现成的面部检索 API&#xff0c;技术层现在有向量数据库。 用 MySQL 关系型存储 128 …

新学期帮娃把拖延症戒了!这个时间管理器太太太有用啦!

十个孩子九个拖延~ 不要唠叨&#xff0c;不要指责 时间流逝一眼可见&#xff0c;打败拖延症&#xff01; 赶紧把这款时间管理器用上 当当狸时间管理器 说起孩子没有时间观念、拖延症 每个老母亲都有一肚子苦水要倒&#xff5e;&#xff5e; 市面上有很多计时器&#xff0…

【k8s集群搭建(一):基于虚拟机的linux的k8s集群搭建_超详细_解决并记录全过程步骤以及自己的踩坑记录】

虚拟机准备3台Linux系统 k8s集群安装 每一台机器需要安装以下内容&#xff1a; docker:容器运行环境 kubelet:控制机器中所有资源 bubelctl:命令行 kubeladm:初始化集群的工具 Docker安装 安装一些必要的包&#xff0c;yum-util 提供yum-config-manager功能&#xff0c;另两…

主题讲座:全球增材制造现状与未来(暨香港科技大学广州|智能制造学域2024博士学位全额奖学金项目)

时间&#xff1a;2023 年11月16日&#xff08;星期四&#xff09;14:30 地点&#xff1a;合肥工业大学 学术会议中心三楼报告厅 主讲嘉宾&#xff1a;陈模军 助理教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/CHEN-Mojun/mjchen 报名表直达&#xff1…

Java 入门基础题

目录 1.输出一个整数的每一位 2.判定素数 3.求最大值方法的重载 4.输出闰年 5.打印 X 图形 6.数字9 出现的次数 7.计算分数的值 8. 模拟登陆 9.使用函数求最大值 10.斐波那契数列 星光不负赶路人&#xff0c;加油铁子们&#xff01;&#xff01;&#xff01; 1…

No205.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

人工智能与充电技术:携手共创智能充电新时代

人工智能与充电技术&#xff1a;携手共创智能充电新时代 摘要&#xff1a;本文探讨了人工智能与充电技术的结合及其在未来充电设施领域的应用。通过分析智能充电系统的技术原理、优势以及挑战&#xff0c;本文展望了由人工智能驱动的充电技术为未来电动交通带来的巨大变革与机…

java实现插入排序

图解 以下是Java实现插入排序的代码&#xff1a; public class InsertionSort {public static void main(String[] args) {int[] arr {5, 2, 4, 6, 1, 3};insertionSort(arr);System.out.println(Arrays.toString(arr)); // output: [1, 2, 3, 4, 5, 6]}public static void i…