持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
什么是生产者和消费者模型
这里举个关于生产者和消费者模型的例子
我们有一个生产糖果的生产者 与 一个消费糖果的消费者,假设 生产是一个线程 消费是一个线程 总共的糖果池是6,这时会出现两个错误 第一如果我们的消费者的消费速度大于生产者的生产速度 就会出现 把糖果消费到0的时候 生产者还没有生产 但消费者还在消费 导致错误,以及生产速度大于消费速度 就会导致 生产到了6个 但是消费者还没有消费 生产者就再次消费 导致糖果池大于了6个 导致错误。
从这个例子我们可以看出来什么问题呢?
这个例子说明了 当两个线程出现类似生产消费等这种关系时 极有可能会出现 某一个线程已经开始不满足接着运行的条件了 但是它还是霸占着cpu 而不是给另外的线程运行,所以我们要解决这个问题,对于上述例子来说,解决方法就是 当生产者生产糖果达到6时就切换到消费线程,当消费线程消费到0时就切换到生产线程。
那么有问题,就肯定需要一个解决问题的答案或者方法,如何解决呢?
在多线程中 我们有两个方法,一个是 wait方法 用于使当前线程陷入等待状态,一个是 notify方法 用于唤醒其他线程。
在上述例子中 如果生产速度大于消费速度时 我们就可以在 生产线程 达到糖果为6这个条件时 进行wait使其陷入等待 并使用notify方法 把消费线程唤醒(如果消费线程本来就没有wait就不需要唤醒),之后就可以切换到消费线程运行 直到消费线程消费后使得生产线程不满足达到6个糖果的条件 我们再使用notify唤醒 生产线程。一直这样下去保证了程序可以正常运行。
一些相关方法的介绍
wait
wait方法是线程等待,这个方法会使拥有对象锁的线程进入等待状态,直到其他线程调用notify或notifyAll方法才能“唤醒”
sleep
sleep方法是线程暂停,是线程用来控制自身流程的,它会使线程暂停一段时间,把执行机会让给其他线程,等计时时间一到,此线程会自动“苏醒”
notify
notify是用来用来唤醒调用wait方法进入等待锁资源队列的线程,唤醒正在等待此对象监视器的单个线程。 如果有多个线程在等待,则选择其中一个随机唤醒(由调度器决定),唤醒的线程享有公平竞争资源的权利
notifyAll
notifyAll是用来用来唤醒调用wait方法进入等待锁资源队列的线程,唤醒正在等待此对象监视器的所有线程,唤醒的所有线程公平竞争资源