java多线程-扩展知识二:线程的生命周期

1、生命周期

        生命周期有广义与狭义之分,狭义为生命科学术语,指包括人类在内的一切动物由出生到死亡经历的生命全程。广义的生命周期泛指自然界与人类社会各种客观事物的阶段性变化及规律,如家庭生命周期、产品生命周期等。本义即狭义的生命周期,专指人类的生命周期。

2、线程的生命周期

        就是线程从生到死的过程中,经历的各种状态及状态转换。

        当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5 种状态。尤其是当线程启动以后,它不可能一直"霸占"着 CPU 独自运行,所以CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

2.1、New(初始化状态)

        用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。如:Thread t = new MyThread();

2.2、Runnable(就绪状态)

        当调用线程对象的start()方法,线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权,并不是说执行了start()此线程立即就会执行。

2.3、Running(运行状态)

        当就绪状态中的线程获得了CUP执行资源,执行run()中的代码,这样的线程我们称为运行状态的线程。

2.4、Blocked(阻塞状态)

        处于运行中的线程,由于某种原因放弃对cpu的使用权,处于阻塞状态,直到其进入就绪状态,才有机会再次被cpu调用进入运行状态。

        根据阻塞原因不同,阻塞分为三种

  • 等待阻塞:运行状态中的线程执行wait方法,进入等待队列,等待阻塞;Java虚拟机就会把线程放到这个对象的等待池中;

  • 同步阻塞:线程获取同步锁失败(因为锁被其他线程占用),Java虚拟机就会把这个线程放到这个对象的锁池中;

  • 其他阻塞:通过调用sleep方法或者join方法或者发出I/O请求时,线程会进入阻塞状态,当sleep()状态超时,或者join()等待线程终止或者超时,或者I/O处理完毕,线程重新转入就绪状态;

2.5、Terminated(终止状态)

  • 正常结束,线程执行完

  • 异常退出
    异常退出,除了程序有问题导致的异常的退出,还可以使用共享变量的方式(定义个boolean标识等)退出,或者Interrupt中断线程,抛出异常,捕获异常break,跳出循环状态;

  • 调用stop(),会造成死锁,线程不安全,不建议使用

3、 java中对线程定义了6种状态

  1. NEW :创建了 Thread 对象,但是还没调用 start() 方法,系统内核里还没有线程。
  2. RUNNABLE:就绪状态(1.正在 CPU 上运行;2.还没在 CPU 运行,但是已经准备好了)
  3. BLOCKED:阻塞状态(等待锁)
  4. WAITING:阻塞状态(线程中调用了 wait() )
  5. TIMED_WAITING:阻塞状态(线程中通过 sleep 进入的阻塞状态)
  6. TERMINATED:系统里面的线程已经执行完毕,销毁了,但是 Thread 对象还在。

 1)新建状态(NEW): 当我们创建一个新的Thread对象时,该线程就处于新建状态,例如:Thread t = new Thread();

2)可运行状态(RUNNABLE): 当线程对象调用start()方法后,线程进入可运行状态。在这个状态下,线程已经做好了准备,随时等待CPU调度执行,这个状态包括了"就绪"和"运行"状态。

3)阻塞状态(BLOCKED): 线程在等待获取一个锁以进入或重新进入同步代码块时,它会进入阻塞状态。只有当该锁被释放并且线程被调度去获取这个锁,线程才能转换到RUNNABLE状态。

4)等待状态(WAITING): 线程进入等待状态,是因为它调用了其它线程的join方法,或者调用了无参数的wait方法。在这种情况下,线程会等待另一个线程的操作完成或者等待notify/notifyAll消息。

5)定时等待状态(TIMED_WAITING): 线程进入定时等待状态,是因为它调用了sleep或者带有指定时间的wait或join方法。在指定的时间过去之后,线程会自动返回RUNNABLE状态。如果它是由于调用wait或join方法进入的定时等待状态,还需要等待notify/notifyAll消息或者等待join的线程终止。

6)终止状态(TERMINATED): 线程任务执行完毕或者由于异常而结束,线程就会进入终止状态。在这个状态下,线程的生命周期实际上已经结束了,它不能再转换到其他任何状态。

3.1、状态转换图

 3.2、状态转换说明

3.2.1、NEW -> RUNNABLE

当通过new Thread()方法创建一个新线程时,该线程处于NEW状态。此时如果调用start()方法启动该线程,该线程就会进入RUNNABLE状态,并被加入JVM的线程调度队列中。

3.2.2、RUNNABLE -> BLOCKED

当一个线程正在获取同步锁时,如果该锁已经被其他线程占用,则该线程将进入BLOCKED状态,等待获取锁以便进入同步区域执行。此时的线程并不会占用CPU资源。

3.2.3、RUNNABLE -> WAITING

当一个线程通过wait()方法进入等待状态时,该线程将进入WAITING状态,并且释放其持有的锁。在该状态下,该线程会暂停执行直到其他线程发出notify()或notifyAll()方法通知它继续执行。

3.2.3.2.4、RUNNABLE -> TIMED_WAITING

当一个线程通过sleep(millis)、join(millis) 或 wait(millis) 方法进入有时限的等待状态时,该线程将进入TIMED_WAITING状态,并且暂停执行一段时间后被自动唤醒,然后再次参与竞争CPU资源。

5、BLOCKED / WAITING / TIMED_WAITING -> RUNNABLE

当当前拥有同步锁的线程释放锁时,将会从BLOCKED状态转换为RUNNABLE状态。当其他线程通过notify()或者notifyAll()方法通知等待某个条件的线程时,该线程将从WAITING或TIMED_WAITING状态转变为RUNNABLE状态。

3.2.6、RUNNABLE -> TERMINATED

线程执行完毕后或线程抛出一个未捕获的异常时,该线程都将进入TERMINATED状态。

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

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

相关文章

任务管理器怎么打开?4个方法快速打开!

“我想进入电脑任务管理器中对某些应用进行设置,但是我不知道应该怎么进入任务管理器中。有什么方法可以快速进入任务管理器吗?” 任务管理器是Windows操作系统中一个强大的工具,可以让你监控和管理计算机上运行的进程、应用程序和性能。当我…

FLASK博客系列5——模板之从天而降

我们啰啰嗦嗦讲了4篇&#xff0c;都是在调接口&#xff0c;啥时候能看到漂亮的页面呢&#xff1f;别急&#xff0c;今天我们就来实现。 来我们先来实现一个简单的页面。不多说&#xff0c;上代码。 app.route(/) def index():user {username: clannadhh}return <html>&…

解决方案:新版WPS-右键粘贴值到可见单元格没有了

旧版WPS&#xff0c;右键就能出现 但是新版WPS不是在这里&#xff08;方法1&#xff09; 新版WPS&#xff08;方法2&#xff09; 视频详细教程链接&#xff1a;解决方案&#xff1a;新版WPS-右键粘贴值到可见单元格没有了 -- 筛选后复制公式粘贴为数值_哔哩哔哩_bilibili

智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.飞蛾扑火算法4.实验参数设定5.算法结果6.参考…

数智融合 开启金融数据治理新时代

11月24日&#xff0c;由上海罗盘信息科技有限公司&#xff08;罗盘科技&#xff09;主办&#xff0c;北京酷克数据科技有限公司&#xff08;酷克数据&#xff09;支持协办的“博学近思 切问治理”数据治理分享会在上海成功举行。 本次会议深度聚焦金融行业数智化转型&#xff…

FPGA模块——DA转换模块(AD9708类)

FPGA模块——DA转换模块&#xff08;AD9708类&#xff09; AD9708/3PD9708代码 AD9708/3PD9708 由于电路接了反相器&#xff0c;所以对应就不一样了。 电路图&#xff1a; 代码 在ROM中存入要输出的波形数据&#xff1a; 用软件生成各个对应的点。 给DA转换器一个时钟&…

网络篇---第四篇

系列文章目录 文章目录 系列文章目录前言一、TCP 如何保证可靠性二、OSI 的七层模型都有哪些?三、浏览器中输入:“www.woaijava.com”之后都发生了什么?请详细阐述前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

关于Unity中字典在Inspector的显示

字典在Inspector的显示 方法一&#xff1a;实现ISerializationCallbackReceiver接口 《unity3D游戏开发第二版》记录 在编辑面板中可以利用序列化监听接口特性对字典进行序列化。 主要继承ISerializationCallbackReceiver接口 实现OnAfterDeserialize() OnBeforeSerialize() …

C# WPF上位机开发(第一个应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 万事开头难&#xff0c;很多事情都是难在第一步。走出了这第一步&#xff0c;回过头看以前走的每一步&#xff0c;发现其实也不难。用c# wpf编写界…

VSD Viewer for Mac(Visio绘图文件阅读器)

VSD Viewer for Mac版是mac上一款非常强大的Visio绘图文件阅读器&#xff0c;它为打开和打印Visio文件提供了简单的解决方案。可以显示隐藏的图层&#xff0c;查看对象的形状数据&#xff0c;预览超链接。还可以将Visio转换为包含图层&#xff0c;形状数据和超链接的PDF文档。 …

【C/PTA —— 12.指针1(课外实践)】

C/PTA —— 12.指针1&#xff08;课外实践&#xff09; 一.函数题6-1 删除字符串中数字字符6-2 找最大值及其下标6-3 求两数平方根之和6-4 求一组数中的最大值、最小值和平均值6-5 两个4位正整数的后两位互换6-6 判断回文字符串 二.程序题7-1 求矩阵每行元素的和 一.函数题 6-…

5.golang字符串的拆解和拼接

字符串是 Go 中的字节切片。可以通过将一组字符括在双引号中来创建字符串" "。Go 中的字符串是兼容Unicode编码的&#xff0c;并且是UTF-8编码的。 访问字符串的单个字节或字符 由于字符串是字节切片&#xff0c;因此可以访问字符串的每个字节。 func printStr(s …

用python实现kindle文件转换pdf

上一篇文章讲了下用工具转换相关的格式&#xff1a;https://blog.csdn.net/weixin_42019349/article/details/134654695 今天来分享一个python库实现上述功能&#xff0c;实现文件转换自由 ^_^ 主角就是pypandoc库 # 安装方式 pip install pypandoc# pypandoc主要有三个函数…

MacOS 系统 Flutter开发Android 环境配置

上节我们已经把 开发工具准备齐全&#xff0c;并可以进行Flutter的web开发&#xff0c;本节将做安卓开发环境进行详细说明 接上节这里先说下&#xff0c;系统环境 MacOS14 &#xff08;Sonoma&#xff09; 芯片 Apple M3 执行命令&#xff1a;flutter doctor 提示如下&#…

好用的样式动画库集合(css、js)

文章目录 前言一、Animate.css二、Anime.js三、CSShake四、Hover.css五、AniJS六、Animista七、Tachyons-animate八、Sequence.js九、Infinite十、OBNOXIOUS.CSS十一、MOTION UI十二、Keyframes.app十三、AnimXYZ十四、Whirl十五、Hamburgers十六、Vivify十七、Magic Animation…

ESP32-Web-Server编程- JS 基础 3

ESP32-Web-Server编程- JS 基础 3 概述 本示例演示通过 button 控件的 onclick 内联属性&#xff0c;实现在网页上点击按钮&#xff0c;切换 LED 灯图标的转变。 示例解析 前端设计 前端代码建立了一个 id 为 “imageLamp” 的图片对象。并建立两个按钮&#xff0c;设计两…

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)

Linux系统安装Docker-根据官方教程教程&#xff08;以Ubuntu为例&#xff09; 1. 背景介绍2. 环境配置2.1 软件环境要求2.2 软件下载2.3 文档地址2.3 必备命令工具下载 3. 安装Docker3.1 使用root用户操作后续命令3.2 卸载可能存在的旧版本 4. 安装Docker4.1 更新依赖包4.4 配置…

lack——主页前后端开发优化(精华:java多线程实现数据插入)

lack——主页前后端开发优化 前端开发主页 最容易的方式&#xff1a;list列表<template><van-cardv-for"user in props.userList":desc"user.profile":title"${user.username} (${user.planetCode})":thumb"user.avatarUrl"…

SAP Smartforms自定义纸张格式

在写SMARTFORM或SAPScript的时候首先要定义纸张格式&#xff0c;如DIN4 A4, DIN5等&#xff0c;但当系统标准的纸张格式并不符合特定的纸张&#xff0c;就需要自定义一种纸张格式了。 总共三个步骤&#xff1a; 定义页格式(横打/竖打&#xff0c; 宽x高)定义格式类型(用于ABA…

PCB板的固螺丝孔连接电阻电容有什么好处

PCB板的固螺丝孔连接电阻电容有什么好处 并联高压电容和大电阻作用好处个人经历看法 并联高压电容和大电阻 我们经常会看到一些系统设计中将PCB板的地(GND)与金属外壳(EGND)之间通常使用一个高压电容C1&#xff08;1~100nF/2KV&#xff09;并联一个大电阻R1&#xff08;1M&…