Java多线程中wait, notify and notifyAll的使用
来源:互联网 发布:北京seo 编辑:程序博客网 时间:2024/06/05 11:23
原文:http://blog.csdn.net/luoweifu/article/details/46664809 讲得很透彻,留档学习。
本文为翻译文章,原文地址:http://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example
在Java的Object类中有三个final的方法允许线程之间进行资源对象锁的通信,他们分别是: wait(), notify() and notifyAll()。
调用这些方法的当前线程必须拥有此对象监视器,否则将会报java.lang.IllegalMonitorStateException exception异常。
wait
Object的wait方法有三个重载方法,其中一个方法wait() 是无限期(一直)等待,直到其它线程调用notify或notifyAll方法唤醒当前的线程;另外两个方法wait(long timeout) 和wait(long timeout, int nanos)允许传入 当前线程在被唤醒之前需要等待的时间,timeout为毫秒数,nanos为纳秒数。
notify
notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统对多线程管理的实现。
notifyAll
notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。
这些方法可以使用于“生产者-消费者”问题,消费者是在队列中等待对象的线程,生产者是在队列中释放对象并通知其他线程的线程。
让我们来看一个多线程作用于同一个对象的例子,我们使用wait, notify and notifyAll方法。
通过实例来理解
Message
一个java bean类,线程将会使用它并调用wait和notify方法。
Message.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
Waiter
一个Waiter类,等待其它的线程调用notify方法以唤醒线程完成处理。注意等待线程必须通过加synchronized同步锁拥有Message对象的监视器。
Waiter.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
Notifier
一个Notifier类,处理Message对象并调用notify方法唤醒等待Message对象的线程。注意synchronized代码块被用于持有Message对象的监视器。
Notifier.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
WaitNotifyTest
一个测试类,交付创建多个等待线程和一个通过线程,并启动这些线程。
WaitNotifyTest.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
当我们调用以上的代码时可以看到以下的输出,但并没有结束(完成),因为有两个线程等待同一个Message对象,但notify()方法只能唤醒一个线程,另一个线程仍然在等待被唤醒。
notify()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如果我们注释掉Notifier类中的notify() 方法的调用,并打开notifyAll() 方法的调用,将会有以下的输出信息。
notifyAll()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
一旦notifyAll()方法唤醒所有的Waiter线程,程序将会执行完成并退出。
- 本文已收录于以下专栏:
- 编程思想
- Java多线程中wait, notify and notifyAll的使用
- Java多线程中wait, notify and notifyAll的使用
- Java多线程中wait, notify and notifyAll的使用
- Java多线程设计wait、notify、notifyall、synchronized的使用机制
- java多线程当中wait notify notifyAll的使用
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- Java多线程,wait,notify,notifyAll的使用例子
- java 多线程 wait()和notify(),notifyAll()的使用
- JAVA多线程的理解wait、notify、notifyAll
- 多线程中wait(),notify(),notifyAll()
- java多线程wait() ,notify() notifyAll()
- java中wait()、notify()以及notifyAll()的使用
- java中wait,notify,notifyAll的使用方法
- 【Java多线程】之五:wait, notify and notifyAll
- java wait notify notifyAll and 多线程顺序打印ABCD
- wait, notify, notifyAll的使用
- java多线程中wait()和notify()和notifyAll()及其他常用方法使用
- android-多线程设计wait、notify、notifyall、synchronized的使用机制
- 近期学习总结
- Android 绑定服务
- Java通过HttpProxy实现穿越
- Unity3D Protobuf-net实际操作教程一
- Java byte数组按位转化为long类型
- Java多线程中wait, notify and notifyAll的使用
- error MSB8031: Building an MFC project for a non-Unicode character set is deprecated
- opencv 链接共享库文件失败
- MySQL IFNULL()函数的用法
- 链表问题——删除链表的中间节点和a/b处的节点
- iptables nat及端口映射 【转】
- Camera原理
- 【队内胡策 11.3】 T1 T2
- 错误:Peer's certificate issuer has been marked as not trusted by the user