Thread.sleep
和 Thread.yield
都是 Java 中用于控制线程行为的方法,但它们的用途和行为有显著区别。
1. Thread.sleep
- 作用:使当前线程暂停执行一段指定的时间(进入阻塞状态)。
- 参数:接受一个时间参数,表示线程休眠的时长(以毫秒为单位),还可以指定纳秒精度。
- 行为:
- 线程会释放 CPU 资源,进入
TIMED_WAITING
状态。 - 休眠期间,线程不会参与 CPU 调度。
- 休眠结束后,线程会进入
RUNNABLE
状态,等待 CPU 调度。
- 线程会释放 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.sleep | Thread.yield |
---|---|---|
线程状态 | 进入 TIMED_WAITING 状态 | 保持 RUNNABLE 状态 |
是否释放锁 | 不会释放持有的锁 | 不会释放持有的锁 |
是否指定时间 | 需要指定休眠时间 | 不需要指定时间 |
是否保证行为 | 休眠时间结束后,线程会恢复执行 | 不保证其他线程一定会获得执行机会 |
用途 | 延迟执行、控制节奏 | 提高线程公平性、减少 CPU 占用 |
4. 总结
- 如果需要让线程暂停一段时间,使用
Thread.sleep
。 - 如果希望当前线程让出 CPU 资源,但不确定其他线程是否会执行,使用
Thread.yield
。 - 两者都不会释放锁资源,因此在同步代码块中使用时需要谨慎。
THE END
暂无评论内容