《多线程编程》学习之七:等待/通知机制(一)

         今天起开始学习线程之间的通信。等待/通知机制是通过Object类的wait()与notify()方法来实现的,这两个方法在同步方法或同步代码块中才能被执行。wait()方法将当前线程放入“等待执行队列”中,使线程在wait()方法所处代码处停止执行,直到被唤醒或者被中断为止,执行wait()方法会释放对象锁。notify()方法用于通知等待对象锁的其它线程,但执行notify()方法并不会立即释放对象锁,要等notify()所在的线程执行完后,才会释放。


1、wait()方法是Object类的方法,要在同步方法/块中执行。



2、只调用wait()方法,则线程会一直等待下去


3、使用notify()唤醒其他线程,但不会立即释放对象锁,而wait()方法会立即释放。




          你想啊,如果wait()方法不释放锁,怎么被notify()呢?本例中,threadB中调用notify()方法后,在sleep(2000),以证明notify()方法并不会立即释放对象锁。


4、notify()方法随机唤醒等待队列中等待共享资源的“一个”线程,notifyAll()方法则唤醒全部。




          可见notify()方法只唤醒一个线程,当调用notify()方法的次数小于线程对象数时,有的线程对象就无法被唤醒了。为唤醒所有的线程,可以使用notifyAll()方法:



5、wait(long)方法:在指定时间内等待被唤醒,超过这个时间则自动唤醒。



6、调用wait()的条件发生变化




        这里出现异常的原因是程序开始时有两个线程执行了list.size() == 0,都处于wait()状态,当程序Thread.sleep(2000)后,往list里添加了一个元素并唤醒上面两个线程,第一个线程成功删除一个元素,第二个线程尝试删除list的元素,但此时list已经为空了,所以抛异常了。一般地,执行wait()的条件用while而不用if,也就是说,只要满足条件了,都要等待。




        


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值