主题
面试速答(先看这里)
**一句话结论:**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 支持有限)。