线程有哪些状态

线程的生命周期

线程在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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

dalle3:Improving image generation with better captions

文生图——DALL-E 3 —论文解读——第一版-CSDN博客文章浏览阅读236次。本文主要是DALLE 3官方第一版技术报告(论文)的解读。 一句话省流版,数据方面,训练时使用95%模型(CoCa)合成详细描述caption 5%原本人…

【Python】【应用】Python应用之一行命令搭建http、ftp服务器

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Python应用&…

R语言——taxize(第一部分)

ropensci 系列之 taxize (中译手册) taxize 包1. taxize支持的网络数据源简介目前支持的API:针对Catalogue of Life(COL) 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…

【LeetCode刷题-滑动窗口】-- 643.子数组最大平均数I

643.子数组最大平均数I 方法&#xff1a;滑动窗口 class Solution {public double findMaxAverage(int[] nums, int k) {int n nums.length;int winSum 0;//先求出第一个窗口的和for(int i 0;i<k;i){winSum nums[i];}//通过遍历求出除了第一窗口的和int res winSum;fo…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

SQL使用

--天空会的像哭过&#xff0c;离开你以后 并没有更自由 SQL进行数据的删除 一、删除delete 语法 delete [from] 表名称 where 条件数据删除&#xff0c;不能删除某一列&#xff0c;因为删除是对记录而言 2.1 删除是一条一条删除&#xff0c;每次删除都会将操作写入日志文件 删…

记录第一次利用CVE-2023-33246漏洞实现RocketMQ宿主机远程代码执行的兴奋

我依然记得自己第一次发现xss漏洞时候的兴奋: 我也记得自己第一次发现sql输入时候的快乐: 直到最近我终于收获了人生的第一个远程代码执行漏洞的利用&#xff08;RCE:remote code execute&#xff09;&#xff0c;虽然这个漏洞的危害远超过了前两个&#xff0c;但是快乐不如前…

RocketMQ(二):基础API

Spring源码系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 RocketMQ(二)&#xff1a;基础API 目录 一、RocketMQ快速入门1、生产者发送消息2、消费者接受消息3、代理者位点和消费者位点 二、消费模型特点1、同一个消费组的不同消费者&#xff0c;订阅主题必须相同2、不…

伊朗黑客对以色列科技行业发起恶意软件攻击

最近&#xff0c;安全研究人员发现了一场由“Imperial Kitten”发起的新攻击活动&#xff0c;目标是运输、物流和科技公司。 “Imperial Kitten”又被称为“Tortoiseshell”、“TA456”、“Crimson Sandstorm”和“Yellow Liderc”&#xff0c;多年来一直使用“Marcella Flore…

加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案&#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方…

模拟散列表(哈希表拉链法)

维护一个集合&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个整数 x&#xff1b;Q x&#xff0c;询问整数 x 是否在集合中出现过&#xff1b; 现在要进行 N 次操作&#xff0c;对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&#xff0c;…

举报“将我的电脑控作己用者”!

既然“麻辣800727”都说是“街子电信”干的&#xff0c;那么&#xff0c;我现在就正式举报&#xff1a;请依法管理宽带网&#xff0c;你国营的也不可以随意侵犯用户的人权&#xff0c;更不可以将自己变成法外之地&#xff01; 请公开答复&#xff0c;并改正&#xff0c;否则把…

机器学习线性代数知识补充

线性代数知识补充 正交矩阵与正交变换方阵特征值与特征向量相似矩阵对角化二次型正定二次型 正交矩阵与正交变换 方阵特征值与特征向量 相似矩阵 对角化 二次型 正定二次型

H5游戏源码分享-超级染色体小游戏

H5游戏源码分享-超级染色体小游戏 游戏玩法 不断地扩大发展同颜色的色块 用最少的步数完成游戏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,user-scalableno,init…

应届裁员,天胡开局——谈谈我的前端一年经历

应届裁员&#xff0c;天胡开局——谈谈我的前端一年经历 许久没有更新了&#xff0c;最近一个月都在忙&#xff0c;没错&#xff0c;正如题目所说&#xff0c;裁员然后找工作… 这周刚重新上班&#xff0c;工作第二天&#xff0c;感慨良多&#xff0c;记录些什么吧。 去年十…

学习samba

文章目录 一、samba介绍二、samba的主要进程三、配置文件四、例子 一、samba介绍 1、SMB&#xff08;Server Message Block&#xff09;协议实现文件共享&#xff0c;也称为CIFS&#xff08;Common Internet File System&#xff09;。 2、是Windows和类Unix系统之间共享文件的…

【Linux】gitee仓库的注册使用以及在Linux上远程把代码上传到gitee上的方法

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家介绍一个在实际工作以及项目开发过程中非常实用的网站gitee&#xff0c;并教如何正确的使用这个网站以及常见问题的解决方案&#xf…

java基础-数据类型

1、变量 变量就是申请内存来存储值。也就是说&#xff0c;当创建变量的时候&#xff0c;需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间&#xff0c;分配的空间只能用来储存该类型数据。 因此&#xff0c;通过定义不同类型的变量&#xff0c;可以在内…

MySQL主主复制

主1 192.168.66.15 主2 192.168.66.16 主1&#xff1a; roottest2 ~]# hostname master1 [roottest2 ~]# bash [rootmaster1 ~]# vim /etc/my.cnf server-id11 log-binmysql-bin auto_increment_increment2 auto_increment_offset1 replicate-do-dbdemo_db …