等待通知机制 wait,notify,notifyAll


一、等待通知机制 相关方法

等待通知的相关方法是任意java对象都具备的,因为这些方法被定义在Object类中。

名称

  描述

notify

 通知一个在对象上wait的线程,使其返回。返回的前提是该线程获得了对象的锁,即监视器monitor

notifyAll

通知所有等待的线程

wait

调用该方法的线程进入等待状态,并且释放该对象的锁。只有接到notify通知或者被中断才会返回。

wait(long)

设置了超时的时间,超时并且没有被通知也会自动返回

wait(long,int)

更精细的超时设置

 

 

二、注意事项

1.使用waitnotifynotifyAll必需先对调用的对象加锁。即等待通知机制依赖于同步机制。先synchronize(对象),再调用 对象.wait()

2.调用wait后,线程从运行状态进入等待状态,并将该线程放入对象的等待队列。

3.Notify后,等待线程不会立即返回,而是需要调用notify的线程释放锁之后,等待线程才有机会返回。

4.Notify方法将等待队列的一个等待线程从等待队列移到同步队列中,而notifyAll则是全部都移到同步队列中。

三、具体过程

waitThread为蓝色线,NotifyThread为红色线

 

WaitThread首先获取了对象的锁,然后调用对象的wait方法,从而放弃锁进入等待队列。随后NotifyThread获得锁资源,并调用notify方法唤醒WaitThread,使他从等待队列移到同步队列进行锁的竞争。当NotifyThread释放锁后,WaitThread就可以获得锁并从wait方法中返回并继续执行。

 

四、经典范式

等待方:1.获取对象的锁

2.如果条件不满足,则等待,被通知后仍要检查

3.条件满足则从等待返回,并继续

 

Synchronize(对象){
  While(条件不满足){
    对象.wait();
  }
  条件满足时的逻辑;
}


 

通知方:1.获得对象锁

2.改变条件

3.通知所有等待在对象上的线程

Synchronize(对象){
  改变条件
  对象.notifyAll();
}


出处: http://blog.csdn.net/parallelyk/article/details/51685464

参考资料:java并发编程艺术


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值