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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 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天前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
45 0
|
5天前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
142 83
|
1月前
|
存储 SQL 安全
Java 无锁方式实现高性能线程实战操作指南
本文深入探讨了现代高并发Java应用中单例模式的实现方式,分析了传统单例(如DCL)的局限性,并提出了多种无锁实现方案。包括基于ThreadLocal的延迟初始化、VarHandle原子操作、Record不可变对象、响应式编程(Reactor)以及CDI依赖注入等实现方式。每种方案均附有代码示例及适用场景,同时通过JMH性能测试对比各实现的优劣。最后,结合实际案例设计了一个高性能配置中心,展示了无锁单例在实际开发中的应用。总结中提出根据场景选择合适的实现方式,并遵循现代单例设计原则以优化性能和安全性。文中还提供了代码获取链接,便于读者实践与学习。
45 0
|
12天前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
154 83
|
1月前
|
存储 Java
说一说 JAVA 内存模型与线程
我是小假 期待与你的下一次相遇 ~
|
1月前
|
移动开发 Java
说一说 Java 是如何实现线程间通信
我是小假 期待与你的下一次相遇 ~
|
1月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
98 5
|
1月前
|
监控 搜索推荐 Java
Java 多线程最新实操技术与应用场景全解析:从基础到进阶
本文深入探讨了Java多线程的现代并发编程技术,涵盖Java 8+新特性,如CompletableFuture异步处理、Stream并行流操作,以及Reactive编程中的Reactor框架。通过具体代码示例,讲解了异步任务组合、并行流优化及响应式编程的核心概念(Flux与Mono)。同时对比了同步、CompletableFuture和Reactor三种实现方式的性能,并总结了最佳实践,帮助开发者构建高效、扩展性强的应用。资源地址:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
116 3

热门文章

最新文章