线程yield(),sleep(), wait()的区别

题目来源:腾讯

答案1:

区别:

  1. 所属类不同:wait()是Object类中的非静态方法;sleep()、yield()是Thread类中的静态方法。

  2. 作用不同:wait()用于线程同步或者线程之间进行通信;sleep()用于休眠当前线程,并在指定的时间点被自动唤醒;yield()临时暂停当前正在执行的线程,来让有同样优先级的正在等待的线程有机会执行(如果等待的线程优先级较低,则当前线程继续执行)。

  3. 释放资源:wait()释放对象锁;sleep()不释放对象锁,抱着锁睡觉;yield()仅释放线程所占用的CPU。

  4. 应用场景不同:wait()适用于同步代码块中;sleep()休眠当前线程,应用场景没有限制;yield()暂停当前线程,应用场景也没有限制。

  5. 被唤醒后的状态不同:wait()被notify()或者notifyAll()唤醒后,先进入阻塞状态(先获得锁),然后进入就绪状态;sleep()被唤醒后,进入就绪状态;yield()不需要唤醒,一直处于就绪状态,获得CPU后继续运行。

    wait 方法是实例方法(非 static 方法),因此不能在 static 中使用。wait/notify 必须搭配 synchronized 使用,否则会报错。