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.hqwc.cn/news/222818.html

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

相关文章

【JavaEE】Java中的多线程 (Thread类)

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…

用队列和栈分别实现栈和队列

用队列实现栈 题目解读 本题的要求是要用两个队列来实现一个先进后出的栈,并且要有以下功能: 1.将元素压入栈中 2.移除栈顶元素并且返回他 3.返回栈顶元素 4.判断栈是否为空 题目构思和代码实现 我们首先要做的就是将实现队列的代码导入该题&#xff…

C语言打印九九乘法表的多种方式多种形式(完整,左上,左下,右上,右下)

📢博客主页:肩匣与橘📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由肩匣与橘编写,首发于CSDN🙉📢生活依旧是美好而又温柔的,你也是✨ …

CodeWhisperer——一个十分强大的工具

使用心得: Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手,可实时提供代码建议。现在已正式可用,面向个人提供免费服务,通过在各种流行的 IDE 里集成 CodeWhisperer(包括我们常用的 JetBrains 产…

AIGC 创业公司还没盈利,微软、Adobe 已赚得盆满钵满

一出奥特曼在 OpenAI「来去之间」的戏码,以回归暂告一段落。 过程很抓马,吃瓜群众很激动,当然了,最开心的还得是微软。 不仅因为这出「闹剧」无论怎么发展,都是微软稳赢,还因为背后潜藏着一个更大的瓜—— …

UniPro集成华为云WeLink 为企业客户构建互为联接的协作平台

华为云WeLink是华为开启数字化办公体验、帮助企业实现数字化转型的实践,类似钉钉。UniPro的客户企业中,有使用WeLink作为协作工具的,基于客户的实际业务需求,UniPro实现了与WeLink集成的能力,以帮助客户企业丰富和扩展…

尝试访问启动磁盘设置时出错怎么办?保姆级教程!

用户案例:尝试访问启动磁盘设置时出错 “由于专业所需软件仅支持Windows系统,我决定在我的MAC电脑上安装Windows 10双系统。然而,安装完成后遇到了问题。Boot Camp打开时报错:“尝试访问启动磁盘设置时出错”,同时…

线上问题整理-ConcurrentModificationException异常

项目场景: 商品改价:商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象 问题描述 商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象,发现偶尔会报 java.util.ConcurrentModificationException: nullat jav…

Maven生命周期

Maven生命周期 通过IDEA工具的辅助,能很轻易看见Maven的九种生命周期命令,如下: 双击其中任何一个,都会执行相应的Maven构建动作,为啥IDEA能实现这个功能呢?道理很简单,因为IDEA封装了Maven提供…

IDEA中Tomcat启动web项目

1.首先【Run】-->【Edit Configurations】,进入对应功能界面 2.点击左上角【】,选择Tomcat Server -->Local 3.Name输入自己中意的,下面两个port,保证没被占用就行 4.切到【Deployment】页签,点击【】&#xff…

力扣373场周赛题解

第一题: 这个题是一个简单题,数据范围也特别小,所以直接使用模拟方式暴力解答。 直接进行行移动的过程,然后检查移动后的结果是否与移动前相同。 代码: ​ public class Solution {// 将指定行循环右移k次pri…

Python代码实现购买打折衣服,并且flask框架在web浏览器上输入购买件数,自动计算出价格

2.某商店T恤的价格为35元/件(2件9折,3件以上8折),裤子的价格为120 元/条(2条以上9折). 小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱? #yifu.py from flask import Flask,render_template,request##…