Java中wait、sleep和yield的区别
Java中wait、sleep的区别或者Java中sleep、yield的区别是Java面试或者多线程面试中最常问的问题之一。首先,一个最明显的区别是:wait是Object类的方法,sleep和yield是Thread类的静态方法。
本质上,wait方法是用来让线程等待某个条件,进入该条件的等待集中。而sleep和yield方法是用来让线程让出CPU时间,把CPU交给线程调度器,使得其他线程能获得CPU时间。
接下来详细比较三个方法。
wait
常用的wait方法有wait( )和wait(long timeout)
wait( )方法导致当前线程进入等待状态直到它被通知(其他线程调用notify或notifyAll方法。notify/notifyAll方法解除等待线程的阻塞状态)。
wait(long timeout) 方法导致当前线程进入等待状态直到它被通知或者经过指定的时间。
wait( )后,线程会释放掉它所占有的对象的锁,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
wait方法只能在一个同步方法中调用。如果当前线程不是对象锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
sleep
Thread.sleep(long millis),必须带有一个时间参数。
sleep(long millis)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行。
sleep(long millis)可能使任意优先级的其他线程得到执行机会。
sleep(long millis)不会释放锁。
调用sleep方法的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
yield
yield方法没有参数。
yield方法使当前线程让出CPU,但让出的时间是不可设定的。
yield方法也不会释放锁。
yield只能把CPU让给相同优先级的其他线程,而不会把CPU给更高或更低优先级的其他线程。若此时没有其他线程跟它在有一个优先级,则该线程继续获得CPU时间,因此可能某线程刚调用yield方法又马上被执行。
微信公众号:FullStackPlan扫一扫可以关注微信公众号哦~