当前位置: 首页 > news >正文

java高并发------线程的六种状态

文章目录

  • java线程六种状态
    • 1.NEW状态
    • 2. RUNNABLE 状态
      • (1)就绪状态
      • (2)执行状态
    • 3. BLOCKED 状态
      • (1)线程等待获取锁
      • (2)IO 阻塞
    • 4. WAITING 状态
    • 5. TIMED_WAITING 状态
    • 6. TERMINATED 状态

java线程六种状态

可以参考:https://www.cnblogs.com/codeclock/p/13803898.html
在这里插入图片描述在这里插入图片描述

以下状态说明均来自:《Java高并发核心编程 多线程、锁、JMM、JUC、高并发设计模式》 卷2 尼恩著

1.NEW状态

通过new Thread(…)已经创建线程,但尚未调用start()启动线程,该线程处于 NEW(新建)状态。虽然前面介绍了 4 种方式创建线程,但是其中的其他三种方式本质上都是通过new Thread()创建线程,仅仅是创建了不同的target执行目标实例(如Runnable实例)。

2. RUNNABLE 状态

Java 把 Ready(就绪)和 Running(执行)两种状态合并为一种状态:RUNNABLE(可执行)状态(或者可运行状态)。调用了线程的start()实例方法后,线程就处于就绪状态。此线程获取到 CPU 时间片后,开始执行run()方法中的业务代码,线程处于执行状态。

(1)就绪状态

就绪状态仅仅表示线程具备运行资格,如果没有被操作系统的调度程序挑选中,线程就永远处于就绪状态。当前线程进入就绪状态的条件大致包括以下几种:

  • 调用线程的start()方法,此线程就会进入就绪状态。
  • 当前线程的执行时间片用完。
  • 线程睡眠(Sleep)操作结束。
  • 对其他线程合入(Join)操作结束。
  • 等待用户输入结束。
  • 线程争抢到对象锁(Object Monitor)。
  • 当前线程调用了yield()方法出让 CPU 执行权限。

(2)执行状态

线程调度程序从就绪状态的线程中选择一个线程,被选中的线程状态将变成执行状态。这也是线程进入执行状态的唯一方式。

3. BLOCKED 状态

处于 BLOCKED(阻塞)状态的线程并不会占用 CPU 资源,以下情况会让线程进入阻塞状态:

(1)线程等待获取锁

等待获取一个锁,而该锁被其他线程持有,则该线程进入阻塞状态。当其他线程释放了该锁,并且线程调度器允许该线程持有该锁时,该线程退出阻塞状态。

(2)IO 阻塞

线程发起了一个阻塞式 IO 操作后,如果不具备 IO 操作的条件,线程就会进入阻塞状态。IO 包括磁盘 IO、网络 IO 等。IO 阻塞的一个简单例子:线程等待用户输入内容后继续执行。

网络 IO 阻塞的原理以及 Java 高性能 IO 编程的核心知识可参阅另一本书《Java 高并发核心编程 卷 1:NIO、Netty、Redis、ZooKeeper》。

4. WAITING 状态

处于 WAITING(无限期等待)状态的线程不会被分配 CPU 时间片,需要被其他线程显式地唤醒,才会进入就绪状态。线程调用以下 3 种方法会让自己进入无限等待状态:

  • Object.wait()方法,对应的唤醒方式为:Object.notify()/Object.notifyAll()
  • Thread.join()方法,对应的唤醒方式为:被合入的线程执行完毕。
  • LockSupport.park()方法,对应的唤醒方式为:LockSupport.unpark(Thread)

5. TIMED_WAITING 状态

处于 TIMED_WAITING(限时等待)状态的线程不会被分配 CPU 时间片,如果指定时间之内没有被唤醒,限时等待的线程会被系统自动唤醒,进入就绪状态。以下 3 种方法会让线程进入限时等待状态:

  • Thread.sleep(time)方法,对应的唤醒方式为:sleep 睡眠时间结束。
  • Object.wait(time)方法,对应的唤醒方式为:调用Object.notify()/Object.notifyAll()主动唤醒,或者限时结束。
  • LockSupport.parkNanos(time)/parkUntil(time)方法,对应的唤醒方式为:线程调用配套的LockSupport.unpark(Thread)方法结束,或者线程停止(park)时限结束。

进入 BLOCKED 状态、WAITING 状态、TIMED_WAITING 状态的线程都会让出 CPU 的使用权;另外,等待或者阻塞状态的线程被唤醒后,进入 Ready 状态,需要重新获取时间片才能接着运行。

6. TERMINATED 状态

线程结束任务之后,将会正常进入 TERMINATED(死亡)状态;或者说在线程执行过程中发生了异常(而没有被处理),也会导致线程进入死亡状态。

http://www.dtcms.com/a/113083.html

相关文章:

  • 蓝桥云客--破译密码
  • CUDA学习--体验GPU性能
  • 【Linux学习笔记】初识进程概念和进程PCB
  • FreeRTOS的空闲任务
  • 【2022】【论文笔记】太赫兹量子阱——
  • opencv的加、减、溶合、位运算
  • Kafka 中,为什么同一个分区只能由消费者组中的一个消费者消费?
  • 文章记单词 | 第24篇(六级)
  • 【MATLAB TCP/IP客户端与NetAssist上位机双向通信实战指南】
  • Redis的公共操作命令
  • 探秘AI(003)之“通义AI”全栈AI能力引领智能化变革
  • 2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化
  • 安装gpu版本的dgl
  • Python解决“组成字符串ku的最大次数”问题
  • Airflow+Spark/Flink vs. Kettle
  • (一)前端程序员转安卓开发分析和规划建议
  • Dify票据识别遇到的分支判断不准确问题
  • 破解GenAI时代工业物联网落地难题:研华IoTSuite如何用“全栈技术“重构智造未来?
  • Roo Code使用MCP服务(大模型上下文协议)
  • 深度学习处理文本(13)
  • SSL证书过期会有什么影响
  • 奈氏准则和 香农定理
  • netty中的ServerBootstrap详解
  • thinkphp8.0上传图片到阿里云对象存储(oss)
  • 2025全新开源双端系统源码:获取通讯录、相册、短信、定位及已装应用信息
  • 程序环境和预处理
  • 第二章日志分析-redis应急响应笔记
  • 贪心算法的使用条件
  • 通义灵码:引领 AI 驱动的编程革命
  • 趣味逆商测试:了解你的逆境应对能力