首页 > 编程语言 >Java基础之并发——线程的生命周期和状态

Java基础之并发——线程的生命周期和状态

时间:2023-03-11 12:36:12浏览次数:44  
标签:状态 生命周期 Java WAITING 线程 等待 运行

Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态:

  • NEW: 初始状态,线程被创建出来但没有被调用 start()
  • RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态。
  • BLOCKED :阻塞状态,需要等待锁释放。
  • WAITING:等待状态,表示该线程需要等待其他线程做出一些特定动作(通知或中断)。
  • TIME_WAITING:超时等待状态,可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。
  • TERMINATED:终止状态,表示该线程已经运行完毕。

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。

 

 由上图可以看出:线程创建之后它将处于 NEW(新建) 状态,调用 start() 方法后开始运行,线程这时候处于 READY(可运行) 状态。可运行状态的线程获得了 CPU 时间片(timeslice)后就处于 RUNNING(运行) 状态。

在操作系统层面,线程有 READY 和 RUNNING 状态;而在 JVM 层面,只能看到 RUNNABLE 状态(图源:HowToDoInJavaJava Thread Life Cycle and Thread States),所以 Java 系统一般将这两个状态统称为 RUNNABLE(运行中) 状态 。

为什么 JVM 没有区分这两种状态呢? (摘自:Java 线程运行怎么有第六种状态? - Dawell 的回答

现在的时分(time-sharing)多任务(multi-task)操作系统架构通常都是用所谓的“时间分片(time quantum or time slice)”方式进行抢占式(preemptive)轮转调度(round-robin 式)。这个时间分片通常是很小的,一个线程一次最多只能在 CPU 上运行比如 10-20ms 的时间(此时处于 running 状态),也即大概只有 0.01 秒这一量级,时间片用后就要被切换下来放入调度队列的末尾等待再次调度。(也即回到 ready 状态)。线程切换的如此之快,区分这两种状态就没什么意义了。

 

 

  • 当线程执行 wait()方法之后,线程进入 WAITING(等待) 状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态。
  • TIMED_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(long millis)方法或 wait(long millis)方法可以将线程置于 TIMED_WAITING 状态。当超时时间结束后,线程将会返回到 RUNNABLE 状态。
  • 当线程进入 synchronized 方法/块或者调用 wait 后(被 notify)重新进入 synchronized 方法/块,但是锁被其它线程占有,这个时候线程就会进入 BLOCKED(阻塞) 状态。
  • 线程在执行完了 run()方法之后将会进入到 TERMINATED(终止) 状态。
 

标签:状态,生命周期,Java,WAITING,线程,等待,运行
From: https://www.cnblogs.com/fulaien/p/17205635.html

相关文章

  • java三层架构
    (68条消息)三层架构、面向接口编程_一个很懒的人的博客-CSDN博客......
  • 解析JAVA环境变量及配置
    写在前面:参考CSDN博主-StandByMeQuan文章:https://blog.csdn.net/qq_37872792/article/details/80642985其实博主已经写得很好了,但是我怕到时后该博文被删了,无法......
  • Java常见语法机制总结
    volatile机制CPU与三级缓存:为了解决CPU按照摩尔定律提升的计算能力和内存缓慢发展的不平衡,三级缓存以其比内存更加强悍的读写能力,在CPU和内存中间充当了一层缓存,缓解了这......
  • 【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
    关于质因数分解算法的不同语言实现,通过实例来看不同语言的差异什么是质因数算法?即任意一个合数可以分解为多个质数相乘。例如:20=2*2*545=3*3*5210=2*......
  • Java应用【XIX】Redis入门
    如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!一、简介1.1Redis是什......
  • 【JavaScript】41_包装类与垃圾回收机制
    10、包装类在JS中,除了直接创建原始值外,也可以创建原始值的对象通过newString()可以创建String类型的对象通过newNumber()可以创建Number类型的对象通过newBoolean()......
  • docker——Error response from daemon: manifest for java:8 not found
    华为linux版本用docker拉取java8报错一开始以为网络问题。但是pingwww.baidu.com没问题。百度查看华为解析  更换安装命令dockerpullopenjdk:8      ......
  • 实际线程数量大于maximumPoolSize
    在做练习的时候出现了下面的状况注:只是自己的推理哈,如果后面学会了看源码再补充和修改首先复习两个知识:临时线程什么时候创建?新任务提交时,发现核心线程都在忙、任......
  • 操作系统学习笔记2-进程和线程
    2.进程和线程2.0引入2.0.1顺序执行特征顺序性封闭性:独占整机资源可再现性:只要在相同的环境与初始条件下,执行结果相同顺序执行的场合:单道批处理系统2.0.2并......
  • JavaScript表单
          ......