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

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 深入解析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月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
792 0
|
3月前
|
Java
Java的CAS机制深度解析
CAS(Compare-And-Swap)是并发编程中的原子操作,用于实现多线程环境下的无锁数据同步。它通过比较内存值与预期值,决定是否更新值,从而避免锁的使用。CAS广泛应用于Java的原子类和并发包中,如AtomicInteger和ConcurrentHashMap,提升了并发性能。尽管CAS具有高性能、无死锁等优点,但也存在ABA问题、循环开销大及仅支持单变量原子操作等缺点。合理使用CAS,结合实际场景选择同步机制,能有效提升程序性能。
|
3月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
447 100
|
4月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
2月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
2月前
|
机器学习/深度学习 人工智能 监控
Java与AI模型部署:构建企业级模型服务与生命周期管理平台
随着企业AI模型数量的快速增长,模型部署与生命周期管理成为确保AI应用稳定运行的关键。本文深入探讨如何使用Java生态构建一个企业级的模型服务平台,实现模型的版本控制、A/B测试、灰度发布、监控与回滚。通过集成Spring Boot、Kubernetes、MLflow和监控工具,我们将展示如何构建一个高可用、可扩展的模型服务架构,为大规模AI应用提供坚实的运维基础。
248 0
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
425 1
|
4月前
|
存储 缓存 算法
Java数据类型与运算符深度解析
本文深入解析Java中容易混淆的基础知识,包括八大基本数据类型(如int、Integer)、自动装箱与拆箱机制,以及运算符(如&与&&)的使用区别。通过代码示例剖析内存布局、取值范围及常见陷阱,帮助开发者写出更高效、健壮的代码,并附有面试高频问题解析,夯实基础。

热门文章

最新文章

推荐镜像

更多
  • DNS