面试题:Java 中 Thread.sleep 和 Thread.yield 的区别?

Thread.sleep 和 Thread.yield 都是 Java 中用于控制线程行为的方法,但它们的用途和行为有显著区别。


1. Thread.sleep

  • 作用:使当前线程暂停执行一段指定的时间(进入阻塞状态)。
  • 参数:接受一个时间参数,表示线程休眠的时长(以毫秒为单位),还可以指定纳秒精度。
  • 行为
    • 线程会释放 CPU 资源,进入 TIMED_WAITING 状态。
    • 休眠期间,线程不会参与 CPU 调度。
    • 休眠结束后,线程会进入 RUNNABLE 状态,等待 CPU 调度。
  • 用途
    • 用于延迟执行。
    • 模拟耗时操作。
    • 控制线程执行节奏。

示例

public class SleepExample {
    public static void main(String[] args) {
        System.out.println("Start");
        try {
            Thread.sleep(2000); // 休眠 2 秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("End");
    }
}

2. Thread.yield

  • 作用:提示线程调度器当前线程愿意让出 CPU 资源,但不会进入阻塞状态。
  • 参数:无参数。
  • 行为
    • 当前线程从 RUNNING 状态变为 RUNNABLE 状态,但仍然可能被线程调度器再次选中执行。
    • 不保证其他线程一定会获得执行机会。
    • 主要用于线程间的协作,避免某个线程长时间占用 CPU。
  • 用途
    • 提高多线程程序的公平性。
    • 在繁忙循环中减少 CPU 占用。

示例

public class YieldExample {
    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " - " + i);
                Thread.yield(); // 让出 CPU
            }
        };

        new Thread(task, "Thread-A").start();
        new Thread(task, "Thread-B").start();
    }
}

3. 主要区别

特性Thread.sleepThread.yield
线程状态进入 TIMED_WAITING 状态保持 RUNNABLE 状态
是否释放锁不会释放持有的锁不会释放持有的锁
是否指定时间需要指定休眠时间不需要指定时间
是否保证行为休眠时间结束后,线程会恢复执行不保证其他线程一定会获得执行机会
用途延迟执行、控制节奏提高线程公平性、减少 CPU 占用

4. 总结

  • 如果需要让线程暂停一段时间,使用 Thread.sleep
  • 如果希望当前线程让出 CPU 资源,但不确定其他线程是否会执行,使用 Thread.yield
  • 两者都不会释放锁资源,因此在同步代码块中使用时需要谨慎。
THE END
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容