问答题1038/1053线程的 sleep()方法和 yield()方法有什么区别?

难度:
2021-11-02 创建

参考答案:

1. Thread.sleep()

含义

当前线程进入阻塞状态(TIMED_WAITING),在指定时间内 不参与 CPU 竞争

特点

  • 必须指定睡眠时间(毫秒 / 纳秒)
  • 睡眠期间 不会占用 CPU
  • 到时间后进入 就绪状态(Runnable),等待重新调度
  • 不会释放锁(monitor)
  • 会抛出 InterruptedException

示例

1try { 2 Thread.sleep(1000); // 睡眠 1 秒 3} catch (InterruptedException e) { 4 e.printStackTrace(); 5}

典型使用场景

  • 控制执行节奏(轮询、定时任务)
  • 模拟耗时操作
  • 降低 CPU 占用

2. Thread.yield()

含义

当前线程主动让出 CPU 使用权,但不进入阻塞状态

特点

  • 没有参数
  • 当前线程仍处于 Runnable 状态
  • 只是提示调度器:“我现在可以让别人先执行”
  • 是否真的让出 CPU 取决于 JVM 和操作系统调度器
  • 不会释放锁
  • 不会抛异常

示例

1Thread.yield();

典型使用场景

  • 多线程竞争激烈时,改善公平性
  • 自旋等待中的“让步”
  • 性能调优(不保证效果)

3. 核心区别对比

对比点sleep()yield()
是否阻塞是(TIMED_WAITING)否(Runnable)
是否释放 CPU可能
是否释放锁
是否可指定时间
是否抛异常是(InterruptedException)
调度是否确定相对确定不确定(提示行为)

4. 执行状态对比

  • sleep()

    RUNNING → TIMED_WAITING → RUNNABLE
    
  • yield()

    RUNNING → RUNNABLE
    

最近更新时间:2026-01-30