# 4. Java线程的生命周期分析
# 标准答案
✅ Java线程的生命周期包括以下状态:新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、等待(WAITING)、计时等待(TIMED_WAITING)和终止(TERMINATED)。线程通过调用start()、wait()、notify()、sleep()等方法在不同状态间切换。
# 答案解析
# 1️⃣ 线程生命周期状态
- 新建(NEW):线程对象被创建但未启动。
- 就绪(RUNNABLE):线程已启动,等待CPU调度。
- 运行(RUNNING):线程获得CPU时间片,正在执行。
- 阻塞(BLOCKED):线程等待获取锁。
- 等待(WAITING):线程等待另一个线程的通知。
- 计时等待(TIMED_WAITING):线程在指定时间内等待。
- 终止(TERMINATED):线程执行完毕或被中断。
# 2️⃣ 线程状态切换
- start()方法:将线程从新建状态切换到就绪状态。
- wait()方法:将线程从运行状态切换到等待状态。
- notify()方法:将线程从等待状态切换到就绪状态。
- sleep()方法:将线程从运行状态切换到计时等待状态。
状态 | 描述 | 触发条件 |
---|---|---|
NEW | 线程已创建 | new Thread() |
RUNNABLE | 等待CPU调度 | start() |
RUNNING | 正在执行 | CPU调度 |
BLOCKED | 等待锁 | synchronized |
WAITING | 等待通知 | wait() |
TIMED_WAITING | 计时等待 | sleep(), join() |
TERMINATED | 执行完毕 | run()结束 |
# 3️⃣ 典型场景与解决方案
# ✅ 适合使用线程状态切换的场景
- 多线程协调
- 通过wait/notify机制实现线程间的协调和通信。
# ❌ 不能用简单状态切换解决的场景
- 复杂的线程调度
- 需要复杂的线程调度和管理。
# 4️⃣ 底层原理解析
# 1. 线程状态管理
- 线程状态由操作系统内核管理,Java通过JNI调用底层API实现状态切换。
# 2. 线程调度与执行
- 线程的调度由操作系统内核负责,多核CPU可以并行执行多个线程。
# 企业真实场景问题分析
# Situation(业务背景)
在某在线支付系统中,多个线程需要协调处理支付请求和响应。
# Task(核心任务 & 关键挑战)
- 如何管理线程的状态转换?
- 如何避免线程间的死锁和资源竞争?
# Action(技术方案 & 逐步拆解)
- 方案1:使用synchronized管理锁
- 确保线程安全,避免死锁。
- 方案2:使用wait/notify机制
- 实现线程间的协调和通信。
# Result(结果分析)
- 使用synchronized可以简化锁管理,但可能导致阻塞。
- 使用wait/notify可以提高线程间的协调性,但需注意通知机制。
# 深入追问
🔹 如何避免线程的死锁?
- 通过锁的顺序和超时机制避免死锁。
🔹 线程的优先级如何影响状态切换?
- 线程优先级影响CPU调度,但不保证优先级高的线程一定先执行。
# 相关面试题
- 如何使用synchronized关键字管理线程状态?
- wait/notify机制如何实现线程间通信?
- 线程的优先级如何影响其执行顺序?