您的位置:首页 > 编程语言

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

2016-10-27 14:00 323 查看
         今天起开始学习线程之间的通信。等待/通知机制是通过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,也就是说,只要满足条件了,都要等待。





        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: