《多线程编程》学习之七:等待/通知机制(一)
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,也就是说,只要满足条件了,都要等待。
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,也就是说,只要满足条件了,都要等待。
相关文章推荐
- 《多线程编程》学习之七:等待/通知机制(二)
- 多线程编程中的等待/通知机制和等待超时模式
- 多线程编程中的等待/通知机制和等待超时模式
- java中等待通知机制(wait/notify)
- Java 并发编程-再谈 AbstractQueuedSynchronizer 2:共享模式与基于 Condition 的等待 / 通知机制实现
- 多线程的等待/通知机制
- 线程锁与等待通知机制
- 等待通知机制 wait,notify,notifyAll
- Java多线程编程-(18)-等待/通知模式接口Condition接口深入分析
- java多线程系列(三)---等待通知机制
- Java线程之间的通信-等待/通知机制
- 《Java并发编程的艺术》读书笔记:等待/通知机制
- java多线程系列(三)---等待通知机制
- 3.1等待/通知机制(wait/notify)
- Condition实现生产者消费者模式(等待/通知机制)
- Java多线程之线程间通信--等待(wait)/通知(notify)机制,等待/通知之交叉备份实例
- 等待通知机制 wait,notify,notifyAll
- 等待&通知机制
- 等待/通知机制
- java多线程中等待/通知机制