yield 方法和 sleep 方法有何不同?
yield()
和sleep()
都是Thread类的方法,都能让出CPU的执行权,但是它们之间存在一些显著的区别:
- 阻塞与否:
sleep()
方法会使得线程进入阻塞状态,即使CPU资源充足,线程在指定的睡眠时间内也不会被调度执行。而yield()
方法只是让出CPU,线程仍然处于可运行状态,一旦CPU资源充足,线程可能马上就会被调度执行。 -
锁释放:
sleep()
方法不会释放已经持有的对象锁,而yield()
方法同样不会释放锁。 -
使用场景:
sleep()
方法常用于让线程暂停执行一段时间,例如在轮询某一资源时,可以让线程每隔一段时间检查一次资源状态。而yield()
方法通常用于调试和测试,或者在某些特定的并发场景下,为了提升系统的整体效率或公平性,手动调整线程的执行顺序。 -
可控性:
sleep()
方法的睡眠时间是可以精确控制的,而yield()
方法是否真正让出CPU,以及让出多长时间,都取决于系统的具体调度策略,无法精确控制。
总的来说,yield()
和sleep()
是两个用于调整线程调度的工具,但它们的使用方式和适用场景都有所不同。在实际编程中,我们通常更倾向于使用java.util.concurrent包中的同步工具,而不是直接使用yield()
或sleep()
来控制线程的调度。