Skip to content

面试速答(先看这里)

**一句话结论:**sleep方法需要指定一个时间,表示sleep的毫秒数,但是有的时候我们会见到Thread.sleep(0)

60秒标准回答:

Thread的sleep会让线程暂时释放CPU资源,然后进入到TIMED_WAITING状态,等到指定时间之后会再尝试获取CPU时间片

sleep方法需要指定一个时间,表示sleep的毫秒数,但是有的时候我们会见到Thread.sleep(0)

这种用法其实就是让当前线程释放一下CPU时间片,然后重新开始争抢

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**Thread的sleep会让线程暂时释放CPU资源,然后进入到TIMED_WAITING状态,等到指定时间之后会再尝试获取CPU时间片。
  • **要点2:**Thread.yield() 的主要作用是提示调度器,当前线程愿意让出 CPU,给其他同优先级或更高优先级的线程运行机会。
  • **要点3:**Thread.sleep(0)其实也不保证一定能被其他线程获取到CPU时间片,但是他会先释放CPU,然后再参加竞争。
  • **要点4:**Thread.sleep(0)是可以被中断的 ,如果被中断,会抛出异常InterruptedException,而Thread.yield()则无法被中断。
  • **要点5:**还有个小小差别,就是 yield() 的实现是依赖于底层操作系统的线程调度策略。

**记忆锚点:**CPU → Threadsleep → sleep → yield → Threadyield → InterruptedException

关键取舍:

  • Thread的sleep会让线程暂时释放CPU资源,然后进入到TIMED_WAITING状态,等到指定时间之后会再尝试获取CPU时间片。
  • 这种用法一般比较少见,很多时候在一些底层框架中,可以用来做线程调度,比如某个线程长时间占用CPU资源,这时候通过sleep(0)让线程主动释放CPU时间片,让其他线程可以进行一次公平的争抢。

加分表达:

  • Thread.sleep(0)是可以被中断的 ,如果被中断,会抛出异常InterruptedException,而Thread.yield()则无法被中断。

追问准备:

  • 围绕「CPU」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Threadsleep」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「sleep」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

Thread的sleep会让线程暂时释放CPU资源,然后进入到TIMED_WAITING状态,等到指定时间之后会再尝试获取CPU时间片。

sleep方法需要指定一个时间,表示sleep的毫秒数,但是有的时候我们会见到Thread.sleep(0)

这种用法其实就是让当前线程释放一下CPU时间片,然后重新开始争抢。

这种用法一般比较少见,很多时候在一些底层框架中,可以用来做线程调度,比如某个线程长时间占用CPU资源,这时候通过sleep(0)让线程主动释放CPU时间片,让其他线程可以进行一次公平的争抢。

扩展知识 ​

和yield的区别 ​

Thread.yield()的主要作用是提示调度器,当前线程愿意让出 CPU,给其他同优先级或更高优先级的线程运行机会。但是它不保证当前线程一定会暂停,也不保证其他线程会立即运行。

Thread.sleep(0)其实也不保证一定能被其他线程获取到CPU时间片,但是他会先释放CPU,然后再参加竞争。这一点和yield有点区别。

Thread.sleep(0)是可以被中断的,如果被中断,会抛出异常InterruptedException,而Thread.yield()则无法被中断。

还有个小小差别,就是yield() 的实现是依赖于底层操作系统的线程调度策略。在某些系统上,它不保证一定能起作用(例如现代 Linux 的 CFS 调度器对 yield 支持有限)。