java线程进入timed_waiting状态是调用带超时参数的方法(如sleep、wait、join、parknanos、await)后由jvm自动触发的,超时时间作为参数传入,单位依方法而异(毫秒/纳秒/指定timeunit),jvm定时唤醒,无需notify或interrupt。

Java 中线程进入 TIMED_WAITING 状态,不是通过“设置超时时间”这个动作主动开启的,而是调用特定带超时参数的方法后自动进入的。换句话说:超时时间是作为参数传给方法的,JVM 根据该参数决定线程等待多久。
以下是几种最常用、最典型的触发方式及对应超时时间的指定方法:
Thread.sleep(long millis) —— 最直接的休眠超时
让当前线程暂停执行指定毫秒数,期间状态为 TIMED_WAITING。
- 超时时间由
millis参数决定(单位:毫秒) - 示例:
Thread.sleep(3000)→ 等待 3 秒,超时后自动回到RUNNABLE
Object.wait(long timeout) —— 同步块内带超时的等待
必须在 synchronized 块中调用,会释放锁并等待通知或超时。
-
timeout单位是毫秒(注意:不是纳秒,也不是TimeUnit) - 示例:
obj.wait(500)→ 最多等 500 毫秒,超时则自动唤醒,无需notify
Thread.join(long millis) —— 等待另一个线程结束(限时版)
主线程调用 thread.join(2000),表示最多等 2 秒,不管目标线程是否结束都会继续执行。
- 超时时间即
millis参数值 - 若目标线程提前结束,
join立即返回;若超时未结束,则继续往下走
LockSupport.parkNanos(long nanos) —— 底层阻塞(纳秒级精度)
JVM 内部和并发包常用,如 ScheduledThreadPoolExecutor 的延迟任务调度。
- 参数单位是纳秒(
1_000_000纳秒 = 1 毫秒) - 示例:
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(100))→ 等 100 毫秒
Condition.await(long time, TimeUnit unit) —— 显式锁的带单位等待
配合 ReentrantLock 使用,比 Object.wait() 更灵活。
- 支持任意
TimeUnit(如SECONDS,MILLISECONDS) - 示例:
condition.await(3, TimeUnit.SECONDS)→ 等 3 秒,超时自动返回
这些方法的共同点是:
- 调用后线程立即进入
TIMED_WAITING - JVM 将其加入内部定时器队列,超时由调度器自动唤醒
- 不依赖其他线程
notify或interrupt,纯靠时间驱动
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











