大家好,欢迎来到IT知识分享网。
设计一个典型的场景,来阐述wait()、notify()、notifyAll(),生产消费者。
有生产者、消费者、缓冲队列(size=10)。
生产者不停地向缓冲队列里放数据,一旦队列满了,则wait(),并notify()消费者进行处理。
消费者不停地从缓冲队列里取数据,一旦队列空了,则wait(),并notify()生产者继续放数据。
生产者:
notifyAll()放在A处,代表缓冲队列满了,再提醒消费者处理。
放在B处,代表只要缓冲队列里有数据,就提醒消费者处理。
消费者:
notifyAll()放在A处,代表缓冲队列空了,再提醒生产者放数据。
放在B处,代表只要处理了缓冲队列里的一个数据,就提醒生产者放数据。
测试类:
先解释一下notify()和notifyAll()。从字面意义上也很好理解,这两个都是用来唤醒wait()的线程,如果有多个线程wait(),notify()只唤醒其中一个,是哪一个就看JVM了。notifyAll()则唤醒所有wait()的线程,至于哪一个能拿到锁并执行,就看JVM了。
举个例子,有10个要吃饭的人都在睡觉(wait),我是送饭的人,我随机叫醒其中一个来吃饭,这是notify。我大喊一声“吃饭啦”,10个人全起来抢饭,这是notifyAll,至于是哪一个能抢到,就看命了。
使用wait、notify、notifyAll要注意的点:
1、 必须在synchronized里使用。
2、 必须在while而非if内使用wait。这是为了线程在被唤醒的前后都会去检查条件是否被满足。以刚才吃饭为例,有两个要吃饭的人,没饭吃就睡觉,有饭吃就被唤醒,然后都去领饭吃。但是在唤醒之后,吃之前要检查一下是否真的有饭,多线程情况下,可能唯一一碗饭被别人抢先拿走了,这时候本应去睡觉,但如果不做检查的话,就会一直去要吃的,从而产生错误。
3、 在多线程要处理的公共对象(数据)那里用wait,在本文,就是缓冲队列。
4、 如果是真多线程,比如多个生产者,多个消费者,用notifyAll更合适。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/61186.html