Java面试题更新 2026-08-05

请从Java并发控制的角度,阐述Thread.sleep与Thread.yield在功能、线程状态转换以及使用场景上的主要不同点。

后端开发技术原理Java

考察说明

考察对Java线程基础控制方法语义差异的理解。

回答思路

  1. 【回答框架 1】Thread.sleep(long millis)使当前线程进入TIMED_WAITING状态,主动让出CPU指定时间,期间不参与调度,时间到后返回RUNNABLE。Thread.yield()是提示性方法,使当前线程从RUNNABLE状态暂时让出CPU,进入就绪队列,但调度器可忽略,不保证一定让出。
  2. 【回答框架 2】功能上看,sleep用于延迟执行或控制频率,常配合循环实现定时任务;yield用于线程协作,让同优先级线程有机会运行,但无强制保证,依赖操作系统调度。
  3. 【回答框架 3】状态方面,sleep明确转换线程状态为TIMED_WAITING,yield不改变线程状态,仍保持RUNNABLE,只是可能被重新调度。使用上sleep必须处理InterruptedException,yield无此异常。
  4. 【回答框架 4】适用场景上,sleep常用于模拟耗时操作或限流;yield通常用于自旋等待或平衡线程执行,但实际开发中较少依赖,因为效果不可控。
  5. 【关键点 1】sleep进入TIMED_WAITING,yield保持RUNNABLE状态。
  6. 【关键点 2】sleep指定时间后必定恢复,yield未必让出CPU。
  7. 【关键点 3】sleep声明抛出InterruptedException,yield没有。
  8. 【易错点 1】误以为yield必定让出CPU,实际依赖调度器实现。
  9. 【易错点 2】sleep(0)并非立即让出,只是释放当前时间片,行为类似yield。
  10. 【易错点 3】混淆两者与wait的区别,wait需在同步块中且释放锁,sleep不释放锁。