线程间通信 - wait 、ntoify 和 notifyAll

Author Avatar
xuanzh.cc 11月 10, 2017
  • 在其它设备中阅读本文章

为了是多线程之间的协作,JDK提供了 wait(), nitify() 和 notifyAll() 这些方法。调用这些方法的时候,必须用 synchronized 代码块包起来,获得一个目标对象的监视器,例如:

1
2
3
4
5
6
7
...
synchronized(obj){
...
obj.wait();
...
}
...

方法签名:

1
2
3
4
5
public final void wait() throws InterruptedException
public final native void notify()
public final native void notifyAll();
wait

让当前线程停止执行,在该对象(obj)上等待,进入到该对象(obj)的等待队列,直到被 notify 或者 notifyAll 方法唤醒

notify

从对象(obj)的等待队列中随机选择一个线程唤醒(不公平的唤醒),假如线程 t 被唤醒后,它不是立即开始执行,而是尝试重新获取对象(obj)这个监视器后才继续执行。

notifyAll

把对象(obj)的当等待列全部唤醒。

wait 和 sleep 的区别:

都可以使线程等待若干时间,但是 因为wait 而被等待的线程可以被唤醒,并且 调用 wait 前要先获取目标对象锁,调用后会释放该锁,但是 sleep不会释放锁。