深入解析Java线程状态与生命周期

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 深入解析Java线程状态与生命周期

深入解析Java线程状态与生命周期

在Java多线程编程中,理解线程的不同状态及其转换对于构建高效、稳定的并发应用至关重要。本文将详细讲解Java线程的六种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED),并通过示例代码展示每种状态的具体表现和触发条件。

1. 新建(New)

描述:线程刚刚被创建,但尚未启动。

触发条件:创建一个新的线程对象后,还没有调用start()方法。

示例

public class ThreadTest implements Runnable{
    @Override
    public void run() {
        System.out.println("线程:"+Thread.currentThread()+" 正在执行...");
    }
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new ThreadTest()); //线程 创建(NEW)状态
    }
}

2. 运行(Running)

描述:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一方式。

触发条件:调用start()方法后,线程进入RUNNABLE状态。

示例

public class RunnableStateExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (true) {
                // Busy work
            }
        });
        thread.start();
        System.out.println(thread.getState()); // 输出:RUNNABLE
    }
}

3. 阻塞(Blocked)

描述:线程在等待进入一个同步块或方法,因为另一个线程已经持有了该同步块或方法的锁。

触发条件:线程试图进入一个被其他线程持有的同步锁时。

示例

public class BlockedExample {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();

        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                while (true) {
                    // Keep the lock
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                // This will not be reached
            }
        });

        t1.start();
        Thread.sleep(100); // Ensure t1 has acquired the lock
        t2.start();
        Thread.sleep(100); // Ensure t2 attempts to acquire the lock
        System.out.println(t2.getState()); // 输出:BLOCKED
    }
}

4. 等待(Waiting)

描述:线程无限期地等待另一个线程执行特定操作(如通知或中断)。

触发条件:线程调用Object.wait()、Thread.join()(不带超时参数)或LockSupport.park()方法时。

示例

public class WaitingExample {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();

        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t1.start();
        Thread.sleep(100); // Ensure t1 has called wait()
        System.out.println(t1.getState()); // 输出:WAITING
    }
}

5. 超时等待(Timed-Waiting)

描述:线程在等待另一个线程执行特定操作,但有超时限制。

触发条件:线程调用带有超时参数的Thread.sleep()、Object.wait()、Thread.join()或LockSupport.parkNanos()和LockSupport.parkUntil()方法时。

示例

public class TimedWaitingExample {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        Thread.sleep(100); // Ensure t1 has called sleep()
        System.out.println(t1.getState()); // 输出:TIMED_WAITING
    }
}

6. 终止(Terminal)

描述:线程已经完成执行或因异常而终止。

触发条件:线程的run()方法执行完成或抛出未捕获的异常。

示例

public class TerminatedExample {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println("Thread is running");
        });

        t1.start();
        t1.join(); // Wait for t1 to finish
        System.out.println(t1.getState()); // 输出:TERMINATED
    }
}

总结

Java线程状态管理是并发编程的基础知识。通过理解线程在不同状态下的行为,可以更好地调试和优化并发程序,避免常见的并发问题如死锁、资源竞争等。Java提供了丰富的API来控制和管理线程状态,使得开发高性能、高可靠性的并发应用程序成为可能。

目录
相关文章
|
3天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
46 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
10天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
8天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
1月前
|
缓存 Java 调度
多线程编程核心:上下文切换深度解析
在现代计算机系统中,多线程编程已成为提高程序性能和响应速度的关键技术。然而,多线程编程中一个不可避免的概念就是上下文切换(Context Switching)。本文将深入探讨上下文切换的概念、原因、影响以及优化策略,帮助你在工作和学习中深入理解这一技术干货。
44 10
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
56 4
|
1月前
|
算法 调度 开发者
多线程编程核心:上下文切换深度解析
在多线程编程中,上下文切换是一个至关重要的概念,它直接影响到程序的性能和响应速度。本文将深入探讨上下文切换的含义、原因、影响以及如何优化,帮助你在工作和学习中更好地理解和应用多线程技术。
40 4
|
1月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
10天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多