Java 中 Thread.sleep 和 Thread.yield 的区别?

Sherwin.Wei Lv7

Java 中 Thread.sleep 和 Thread.yield 的区别?

回答重点

Thread.sleep()Thread.yield() 都是用于控制线程行为的两个方法。

**Thread.sleep()**:

  • 使当前线程进入休眠状态(TIMED_WAITING 状态),暂停执行指定的时间(以毫秒为单位)。在休眠期间,线程不会占用 CPU 时间片。休眠结束后,线程会尝试重新获取 CPU 时间片,进入可运行状态。
  • 休眠时间取决于操作系统的计时器精度,可能会有轻微的误差。

**Thread.yield()**:

  • 提示当前线程愿意让出 CPU 时间片给其他线程。调用 yield() 后,线程会进入 RUNNABLE 状态,但没有阻塞。调度器会尝试将 CPU 时间片分配给相同优先级的其他线程。如果没有其他合适的线程,当前线程可能会继续执行。
  • yield() 只是一个提示,操作系统的线程调度器可以选择忽略它。
  • 它并不会使线程进入阻塞状态,线程依然处于 RUNNABLE 状态。

扩展知识

Thread.sleep()Thread.yield() 的底层机制

  • Thread.sleep() 底层调用了操作系统的定时器机制,线程在指定时间内停止执行。当时间结束后,线程会被唤醒并进入可运行状态,等待 CPU 时间片的重新分配。
  • Thread.yield() 只是通知线程调度器当前线程愿意让出时间片,具体的实现和效果依赖于操作系统的线程调度策略。

应用场景

  • 调试和测试:有时用 yield() 来调整线程调度,帮助检测并发问题。
  • 降低优先级:让当前线程主动让出 CPU 时间片,给其他优先级相同的线程执行机会。
  • CPU 密集型任务:在高计算密集型任务中使用 yield(),可以避免某些线程长时间占用 CPU。

Thread.sleep(0) 的作用是什么?

Comments
On this page
Java 中 Thread.sleep 和 Thread.yield 的区别?