Java中wait和notify方法的详解

等待和通知的相关方法: 等待的相关方法:
wait(): 调用wait方法的该线程会进入Waiting状态,只有等待另外的线程的通知或者被中断才会返回,需要注意的是:调用了wait方法后,会释放对象的锁。
wait(long): 超时等待一段时间,这里的参数时间单位是ms,类型是long,意思是如果等待超过了设定时间还未收到通知,就会超时返回。

通知的相关方法:
notify(): 通知一个在对象上等待的线程,使其从wait方法返回,而返回的前提得是该线程获取到了对象的锁。如果没有获取到锁,只是从Waiting状态变成了Blocked状态。
notify All(): 通知所有在该对象上等待的线程。
等待和通知的机制,拿两个线程来说,线程A调用了对象O的wait方法进入等待状态,而线程B调用了对象O的notify方法,线程A收到了通知后从对象O的wait方法返回,进而执行后续操作。综上来说,等待和通知是两个线程通过对象来完成交互的。
对于上述方法使用需要注意的细节:
1.使用wait()和notify()、notify All()方法时需要先对调用对象加锁。(wait和notify都要搭配synchronized来进行使用。) 而且它们都不属于Thread类,而是属于Object类。
2.调用wait()方法后,该线程进入Waiting状态,并将当前线程放置到对象的等待队列。
3.notify()和notify All()方法调用后,等待的线程并不会立即从wait()返回,而是要等调用notify和notify All()的线程释放完锁后, 等待线程才有机会从wait()方法中返回。
4.notify()方法是将一个等待的线程从等待队列中移到同步队列中,而notify All()方法是将所有的线程从等待队列中移到同步队列。被移动的线程状态从Waiting状态变成Blocked状态。
5.从wait()方法,返回的前提是获得了调用对象的锁。
6.synchronized,wait,notify三者的对象都是同一个。
7.即使当前线程没有在wait,空大调用notify不会有任何的副作用。
8.如果同一个对象在多个线程中都在wait,那么此时调用当前对象的notify方法,只会随机不指定的唤醒一个线程。如果是多个对象在多个线程中都在wait,那么调用对象的notify方法,就可以唤醒各自对象对应所在的线程。

总结上述等待和通知的过程:
最开始是线程A获取了对象的锁,然后调用了对象的wait()方法后,从而释放了锁,并且让线程A进入了对象的等待队列中,进入了Waiting状态。此时由于线程A释放了对象的锁,线程B就有机会随后获取到了对象的锁,并且调用了notify()方法,此时线程A接到了通知,随后就从对象的等待队列进入了同步队列(SynchronizedQueue),此时线程A从Waiting状态进入了Blocked状态,如果线程B又释放完对象的锁后,线程A有机会获取到对象的锁,就会从wait()方法返回继续执行后续的操作。

文章转自:Java中wait和notify方法的详解_Java-答学网

作者:答学网,转载请注明原文链接:http://www.dxzl8.com/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值