【Java】线程状态:线程生命周期的六个阶段

embedded/2024/9/23 21:59:09/

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

在Java中,线程可以处于多种状态,这些状态描述了线程的生命周期。了解这些状态及其转换条件对于编写高效且无错误的多线程应用程序至关重要。本文将总结Java线程的几种状态,每种状态的含义,以及状态之间的切换条件。

线程状态的种类及含义

Java线程的状态主要有以下几种:

  1. 新建状态(New)线程对象已被创建,但还没有调用start()方法。
  2. 可运行状态(Runnable)线程已经调用了start()方法,可能正在运行,也可能正在等待CPU时间片。
  3. 阻塞状态(Blocked)线程因为等待监视器锁(即等待某个同步锁)而进入阻塞状态,它在等待获取该资源的锁。
  4. 等待状态(Waiting)线程通过调用wait()join()或者LockSupport.park()方法进入等待状态,需要其他线程通知或中断才能返回。
  5. 计时等待状态(Timed Waiting)线程通过调用sleep(long millis)wait(long timeout)join(long millis)LockSupport.parkNanos()}LockSupport.parkUntil()等方法,进入计时等待状态,与等待状态类似,但是有最大时间限制,超过时间后会自动唤醒。
  6. 终止状态(Terminated)线程的run()方法执行结束,或者因异常退出了run()方法。

状态之间的切换条件

  1. 从新建到可运行:调用线程start()方法。
  2. 从可运行到阻塞线程尝试获取一个已经被其他线程持有的锁。
  3. 从可运行到等待:调用wait()join()LockSupport.park()方法。
  4. 从可运行到计时等待:调用sleep(long millis)wait(long timeout)join(long millis)LockSupport.parkNanos()}LockSupport.parkUntil()方法。
  5. 从等待到可运行:其他线程调用了当前线程notify()notifyAll()方法,或者当前线程LockSupport.unpark(Thread)被调用。
  6. 从计时等待到可运行:等待时间结束,线程自动唤醒。
  7. 从可运行到终止线程执行完run()方法,或者在run()方法中发生未捕获的异常。
  8. 从阻塞到可运行线程成功获取到锁,锁被释放后线程可以继续执行。

以下是线程状态的转换代码示例:

  1. 新建到可运行(NEW -> RUNNABLE)
public class ThreadStateExample {public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println("Thread is running");});System.out.println("Thread state before start: " + thread.getState()); // NEWthread.start();System.out.println("Thread state after start: " + thread.getState()); // RUNNABLE}
}
  1. 可运行到终止(RUNNABLE -> TERMINATED)
public class ThreadStateExample {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {System.out.println("Thread is running");});thread.start();thread.join(); // 等待线程结束System.out.println("Thread state after thread.join: " + thread.getState()); // TERMINATED}
}
  1. 可运行到等待(RUNNABLE -> WAITING)
public class ThreadStateExample {private static final Object lock = new Object();public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();Thread.sleep(1000); // 确保线程进入WAITING状态System.out.println("Thread state: " + thread.getState()); // WAITING}
}
  1. 可运行到计时等待(RUNNABLE -> TIMED_WAITING)
public class ThreadStateExample {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {try {Thread.sleep(5000); // 线程进入计时等待状态} catch (InterruptedException e) {e.printStackTrace();}});thread.start();Thread.sleep(1000); // 确保线程进入TIMED_WAITING状态System.out.println("Thread state: " + thread.getState()); // TIMED_WAITING}
}
  1. 可运行到阻塞(RUNNABLE -> BLOCKED)
public class ThreadStateExample {private static final Object lock = new Object();public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(() -> {synchronized (lock) {try {Thread.sleep(10000); // 持有锁并休眠} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {synchronized (lock) { // 尝试获取已被thread1持有的锁,因此进入BLOCKED状态// 执行相关操作}});thread1.start();Thread.sleep(1000); // 确保thread1持有锁thread2.start();Thread.sleep(1000); // 确保thread2尝试获取锁System.out.println("Thread2 state: " + thread2.getState()); // BLOCKED}
}

 


希望这篇博客能为你理解线程状态提供一些帮助。

如有不足之处请多多指出。

我是高耳机。


http://www.ppmy.cn/embedded/112798.html

相关文章

单组件的编写

项目搭好了,第一个需要了解的是 Vue 组件的变化,由于这部分篇幅会非常大,所以会分成很多个小节,一部分一部分按照开发顺序来逐步了解。 因为 Vue 3 对 TypeScript 的支持真的是太完善了,并且 TypeScript 的发展趋势和…

从零开始搭建 PHP

🛠️ 从零开始搭建 PHP 环境:详细教程 PHP(Hypertext Preprocessor)是最流行的后端脚本语言之一,广泛用于构建动态网站和 Web 应用程序。在开始 PHP 开发之前,首先需要搭建 PHP 运行环境。无论你使用的是 …

Python---爬虫

文章目录 目录 前言 一.Http请求/响应模块 requests模块 二.文本筛选模块 re模块 XPath模块 XPath 路径表达式 XPath 语法元素 三. 爬虫模板 爬虫案例 前言 Python爬虫是一种通过自动化程序爬取互联网上的信息的技术。爬虫可以自动访问网页并提取所需的数据,比…

56. 合并区间

思路 对区间进行排序:按每个区间第一个数的大小进行升序排序 排好序后,初始化 dp[0]第一个区间 则下一个区间是否为一个单独区间,只需要看 这个区间的第一个数是否小于等于上一个区间的第二数,小于等于,则在上一个区间…

大数据之Spark(二)

9.4.3、RDD持久化 RDD之间进行相互迭代计算(Transformation的转换),当执行开启,新RDD的生成代表旧RDD消失。如果有的rdd需要重复使用就需要将rdd缓存,rdd.cache()或rdd.persist()。清理缓存rdd.unpersist() 缓存特点&…

Linux基础---07文件传输

Linux文件传输地图如下,先选取你所需的场景,若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网: 检查网络是否畅通命令:ping www.baidu.com,若有持续的返回值就说明网络畅通。Ctr…

【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

沉浸式利用自然语言无代码开发工具生成式AI产品应用(下)

背景 小伙伴们过去在开发应用时,经常需要编写大量代码文件以实现业务逻辑,想必肯定有小伙伴开发过类似于快消行业索赔处理、订单库存跟踪和项目审批等系统。去解决这些业务实际问题,我们需要定制地开发业务应用程序为这些问题提供解决方案。…