这三个方法都是java多线程编程中常用的方法,都是用来让出当前线程的执行权,它们的区别如下:
1、wait是Object对象的方法,sleep和yield是Thread对象的方法。
2、wait会释放当前线程占用的锁,并且必须在同步块中调用,其他两个方法不会释放锁,也不需要再同步块中调用。
3、wait可以使当前线程等待一段时间后重新执行,也可以一直等待直到其他线程调用notify/notifyAll唤醒当前线程后再执行。
4、sleep使当前线程“睡眠”一段时间,从而让其他线程获取执行的机会,包括优先级较低的线程。
5、wait、sleep都会阻塞当前线程,但yield不会,yield只是让出cpu的占有权,但是当前线程仍处在可执行状态,调用yield后会先检测是否有相同优先级的处于可执行状态,如果有则把cpu的执行权交给此线程,否则继续运行当前线程,也就是说yield只是让同等优先级的线程有执行的机会,调用yield后当前线程可能不受影响继续运行。