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 获取更多干货

Copyright © 2016 - 2017 LBD All Rights Reserved.

访客数 : | 访问量 :