Java一个线程的生命周期详解

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Java中,一个线程的生命周期分为五个阶段:NEW(新建),RUNNABLE(可运行),BLOCKED(阻塞),WAITING(等待),TERMINATED(终止)。线程创建后处于新建状态,调用start方法进入可运行状态,执行中可能因等待资源进入阻塞或等待状态,正常完成或异常终止后进入终止状态。各状态间可相互转换,构成线程的生命周期。

Java 线程生命周期是指线程从创建到终止的整个过程。一个线程的生命周期可以分为多个状态,每个状态之间可以根据特定事件进行转换。以下是线程生命周期的详细介绍:

1. 线程的状态

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

  • 新建 (New):线程被创建后,处于新建状态。在这个状态下,线程对象已经被创建,但是尚未开始执行。

  • Runnable (就绪):线程在新建状态后调用 start() 方法进入 Runnable 状态。这个状态表示线程已经准备好运行,但并不一定正在运行;它可能会因为 CPU 的调度而被挂起。Runnable 状态实际上包括了所有准备要执行以及正在执行的线程。

  • Blocked (阻塞):当一个线程试图获取一个已经被其他线程持有的对象锁时,它会进入阻塞状态。此时,该线程无法继续执行,直到获得该锁。

  • Waiting (等待):处于等待状态的线程是在等待某个条件的发生,通常是通过调用 Object.wait()Thread.join()LockSupport.park() 等方法。线程在这个状态不能被调度。

  • Timed Waiting (计时等待):与等待状态类似,但在计时等待状态下,线程在一定的时间后会自动返回 Runnable 状态。常见的调用方法包括 Thread.sleep(millis)Object.wait(millis)Thread.join(millis)LockSupport.parkNanos()

  • Terminated (死亡):线程完成执行或由于异常结束后进入终止状态。在这个状态下,线程对象仍然存在,但无法重新启动。

2. 状态转换过程

以下是线程在不同状态之间的转换过程:

  1. 新建到 Runnable:线程通过调用 start() 方法转换为 Runnable 状态。
  2. Runnable 到 Running:当线程获得 CPU 时间片时,转换为 Running 状态。
  3. Running 到 Blocked:如果线程试图获取一个被其他线程持有的锁,它将进入 Blocked 状态。
  4. Running 到 Waiting:当线程调用 Object.wait()Thread.join() 等方法后,将进入 Waiting 状态。
  5. Running 到 Timed Waiting:调用 Thread.sleep(millis)Object.wait(millis) 后,将进入 Timed Waiting 状态。
  6. Waiting 到 Runnable:当满足条件后(如调用 notify()notifyAll()),线程将转回 Runnable 状态。
  7. Blocked 到 Runnable:当持有锁的线程释放锁后,阻塞的线程将转换为 Runnable 状态。
  8. 任何状态到 Terminated:当线程的 run() 方法执行完毕或抛出未捕获的异常时,线程进入 Terminated 状态。

3. 线程状态图

以下是 Java 线程状态的简化状态图示意:

          +-------+
          |  New  |----->  +--------+
          +-------+        | Runnable|
                          +--------+
                               |   ^
                               v   |
                           +-----------+
                           |  Running  |
                           +-----------+
                               | | |
               +---+          | | |
               |   |          | | |
               v   v          | | |
          +--------+         +--------+
          | Blocked |         | Waiting |
          +--------+         +--------+
               ^                ^
               |                |
               +----------------+

4. 例子

下面的代码片段展示了如何创建一个线程,以及它的生命周期中的状态转换:

class MyThread extends Thread {
   
    public void run() {
   
        try {
   
            System.out.println(Thread.currentThread().getName() + " is running.");
            Thread.sleep(1000); // Timed Waiting 状态
            System.out.println(Thread.currentThread().getName() + " is resumed.");
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
    }
}

public class ThreadLifecycleExample {
   
    public static void main(String[] args) {
   
        MyThread thread = new MyThread(); // New 状态
        thread.start(); // 变为 Runnable 状态
    }
}

5. 总结

理解 Java 线程的生命周期对于开发并发程序非常重要。线程的状态决定了线程的执行行为和调度策略,对于实现复杂的多线程应用至关重要。合理使用线程的状态转换,有助于提高程序的性能和响应能力。

相关文章
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
370 1
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
348 1
|
7月前
|
机器学习/深度学习 人工智能 监控
Java与AI模型部署:构建企业级模型服务与生命周期管理平台
随着企业AI模型数量的快速增长,模型部署与生命周期管理成为确保AI应用稳定运行的关键。本文深入探讨如何使用Java生态构建一个企业级的模型服务平台,实现模型的版本控制、A/B测试、灰度发布、监控与回滚。通过集成Spring Boot、Kubernetes、MLflow和监控工具,我们将展示如何构建一个高可用、可扩展的模型服务架构,为大规模AI应用提供坚实的运维基础。
561 0
|
8月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
341 0
|
8月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
516 16
|
9月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
9月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
10月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
485 83
|
10月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
410 0