Java基础教程(135)多线程之线程的状态:线程的生死时速,Java多线程状态全景透析

本文将用生动代码示例带你穿透Java线程的六大状态,彻底掌握状态转换的本质逻辑。

1. 线程状态全景图

Java线程在生命周期中会经历不同的状态,这些状态在Thread.State枚举中明确定义:

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

2. 六大状态深度解析

2.1 新建状态(NEW)

当线程对象被创建但尚未启动时:

Thread thread = new Thread(() -> {
    // 线程任务
});
System.out.println(thread.getState()); // 输出: NEW

2.2 可运行状态(RUNNABLE)

一旦调用start()方法,线程进入RUNNABLE状态,注意此状态包含就绪和运行中两种子状态:

thread.start();
System.out.println(thread.getState()); // 输出: RUNNABLE

2.3 阻塞状态(BLOCKED)

线程等待监视器锁时的状态:

public class BlockedStateExample {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                try { Thread.sleep(1000); } 
                catch (InterruptedException e) {}
            }
        });
        
        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                // 获取锁
            }
        });
        
        t1.start();
        Thread.sleep(100); // 确保t1先获取锁
        t2.start();
        Thread.sleep(100); // 确保t2已启动
        
        System.out.println(t2.getState()); // 输出: BLOCKED
    }
}

2.4 等待状态(WAITING)

线程无限期等待其他线程执行特定操作:

public class WaitingStateExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                Thread.currentThread().join(); // 自己等待自己,将永远等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        thread.start();
        Thread.sleep(500);
        System.out.println(thread.getState()); // 输出: WAITING
    }
}

2.5 定时等待状态(TIMED_WAITING)

线程等待指定的时间:

public class TimedWaitingStateExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        thread.start();
        Thread.sleep(500);
        System.out.println(thread.getState()); // 输出: TIMED_WAITING
    }
}

2.6 终止状态(TERMINATED)

线程执行完毕后的状态:

public class TerminatedStateExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            // 简单任务
        });
        
        thread.start();
        Thread.sleep(1000); // 等待线程执行结束
        
        System.out.println(thread.getState()); // 输出: TERMINATED
    }
}

3. 状态转换实战演示

以下示例展示完整的状态流转过程:

public class ThreadLifecycleDemo {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        
        Thread thread = new Thread(() -> {
            // 状态转换:NEW -> RUNNABLE
            synchronized (lock) {
                try {
                    Thread.sleep(1000);        // TIMED_WAITING
                    lock.wait();               // WAITING
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        
        System.out.println("创建后: " + thread.getState()); // NEW
        
        thread.start();
        System.out.println("启动后: " + thread.getState()); // RUNNABLE
        
        Thread.sleep(100);
        synchronized (lock) {
            System.out.println("获取锁后: " + thread.getState()); // BLOCKED
            lock.notify();
        }
        
        Thread.sleep(100);
        System.out.println("等待后: " + thread.getState()); // TIMED_WAITING
        
        Thread.sleep(2000);
        System.out.println("最终状态: " + thread.getState()); // TERMINATED
    }
}

4. 状态监测与实战技巧

状态监测要点:

  • getState()方法返回线程当前状态
  • 状态转换由JVM控制,非人为直接干预
  • 阻塞和等待状态是性能优化的关键关注点

实战建议:

  1. 使用jstack或可视化工具监控线程状态
  2. 避免过度线程阻塞,减少WAITING/BLOCKED状态时间
  3. 合理设置超时时间,避免永久等待
  4. 使用线程池管理线程生命周期

5. 总结

掌握Java线程状态转换机制是多线程编程的基石。通过本文的代码示例,我们能够清晰理解:

  • 每种状态的具体触发条件
  • 状态之间的转换关系
  • 如何诊断和解决线程阻塞问题

精准掌控线程状态,才能编写出高效、稳定的并发应用程序,真正发挥多核处理器的强大威力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值