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

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

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

1. 新建(New)

描述 :线程刚刚被创建,但尚未启动。
触发条件 :创建一个新的线程对象后,还没有调用start()方法。
示例

java 复制代码
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状态。
示例

java 复制代码
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)

描述 :线程在等待进入一个同步块或方法,因为另一个线程已经持有了该同步块或方法的锁。
触发条件 :线程试图进入一个被其他线程持有的同步锁时。
示例

java 复制代码
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()方法时。
示例

java 复制代码
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()方法时。
示例

java 复制代码
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()方法执行完成或抛出未捕获的异常。
示例

java 复制代码
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来控制和管理线程状态,使得开发高性能、高可靠性的并发应用程序成为可能。

相关推荐
Oneforlove_twoforjob5 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
向宇it21 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行24 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想1 小时前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。2 小时前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea