Java之wait()/sleep()和notify()/notifyAll()

好了,来总结下wait()/sleep()和notify()/notifyAll()。

  1. wait()/sleep():
    wait()属于Thread类,它的作用是让访问当前对象的线程进入等待,它必须在关键字Synchronized下使用。wait()的线程必须被notify()/notifyAll()唤醒后才能运行,且在等待期间线程会放弃对象锁,只有唤醒后再去尝试对象锁。
    sleep()方法指定了程序暂停执行指定的时间,让出cpu给其他线程,但在等待期间线程不会放弃对象锁,当指定的时间到了又会自动唤醒,恢复运行状态。
  2. notify()/notifyAll():
    notify()/notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。
    void notify(): 唤醒一个正在等待该对象的线程。
    void notifyAll(): 唤醒所有正在等待该对象的线程。
    两者的最大区别在于:
    notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
    notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
原文地址:https://www.cnblogs.com/Sherlock-J/p/12926091.html