yield()让线程从运行态转为就绪态,建议系统进行调度切换,不释放锁且不保证生效;sleep()使线程进入阻塞态一段时间,释放CPU但不释放锁,时间确定并需处理InterruptedException。

yield() 和 sleep() 都是 Java 中用于线程控制的方法,定义在 Thread 类中,但它们的作用和使用场景有明显区别。
1. yield() 方法:线程让出 CPU 执行权
调用 yield() 表示当前线程愿意暂时放弃 CPU 资源,让系统调度器重新选择一个线程来执行(通常是相同优先级的其他线程)。
- yield() 是静态方法,作用于当前正在运行的线程。
- 调用后,线程从运行状态回到就绪状态,不进入阻塞状态。
- 操作系统可能忽略该请求,即调用 yield() 后,该线程仍可能被再次调度执行。
- 不会释放锁(monitor),只是让出 CPU。
2. sleep() 方法:线程暂停执行一段时间
调用 sleep(long millis) 会使当前线程暂停指定时间(毫秒),在此期间线程进入阻塞状态,不会参与 CPU 调度。
专业级别的大型网站建站产品,JAVA技术的CMS管理系统,ospod提供上百套专业模板供您选择,包括审批工作流,流量统计和流行网络应用,是公司企业建设专业网站的首选产品,也使用于专业建站人士完成复杂网站项目。管理地址cmsadmin登陆用户名:ospod 密码:ospod1234
- sleep() 也是静态方法,影响当前线程。
- 线程在 sleep 期间会释放 CPU,但不会释放任何同步锁。
- 时间结束后,线程进入就绪状态,等待调度。
- 可能会抛出
InterruptedException,必须处理。
3. 主要区别总结
- 目的不同:yield() 是建议调度器切换线程;sleep() 是强制线程暂停一段时间。
- 状态变化不同:yield() 线程回到就绪状态;sleep() 线程进入阻塞状态。
- 是否可预测:sleep() 的暂停时间是确定的;yield() 是否生效取决于 JVM 和操作系统。
- 异常处理:sleep() 必须捕获或抛出 InterruptedException;yield() 不抛出异常。
4. 使用建议
- 不要依赖 yield() 来保证程序逻辑正确性,它更多用于性能优化或调试。
- sleep() 常用于定时任务、轮询、模拟延迟等需要明确等待时间的场景。
- 两者都不会释放对象锁,若需释放锁并等待,应使用
wait()方法。
基本上就这些。理解清楚它们的状态转换和使用意图,能更好控制多线程行为。










