Java多线程
设计典型场景,讲述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个吃饭的人在睡觉,我是送饭的人,我随机叫醒其中一个吃饭。 这是通知。 我一喊“吃饭啊”,10个人都起来抢饭。 这是通知全部。 哪个能夺走取决于生命。
使用wait、notify、notifyAll时需要注意的事项:
1、必须在同步化中使用。
2、必须在while内而不是if内使用wait。 这是为了检查线程在觉醒前后是否满足条件。 以刚才的饭菜为例,有两个人吃饭,没有饭就睡觉,有饭就被叫醒,去领饭。 但是,醒来后,吃之前必须检查是否真的有饭吃。 多线程的话,唯一的饭可能会被别人先拿走。 这个时候应该睡觉的,不检查的话,会永远去吃,会发生错误。
3、在多线程处理的公共对象(数据)处使用wait。 在本文中,是缓冲队列。
4、多个生产者、多个消费者等,如果是真正的多线程,使用notifyAll比较合适。