线程协作 生产者消费者模式

简介: 线程协作 生产者消费者模式

应用场景:

  1. 假设仓库中只能生产一件商品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费
  2. 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止
  3. 如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止


image.png


线程通信分析

这个一个线程同步问题,生产者和消费者共享一个资源,并且生产者和消费者之间相互依赖,互为条件

  1. 对于生产者,没有生产产品之前,要通知消费者等待,而生产了产品之后,有需要马上通知消费者消费
  2. 对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费
  3. 在生产者消费者问题中,仅有synchronized是不够的
  1. synchronized可阻止并发更新同一个共享资源,实现了同步
  2. synchronized不能用来实现不同线程之间的消息传递(通信)



线程通信

Java提供了几个方法解决线程之间的通信问题


方法名

作用

wait()

表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁

wait(long timeout)

指定等待的毫秒数

nofity()

唤醒一个处于等待状态的线程

nofityAll()

唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度

注意:以上均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常IIIegalMonitorStateException

解决方式 1

并发协作模型,"生产者/消费者模式"-->管程法

  1. 生产者:负责生产数据的模块(可能是方法,对象,线程,进程);
  2. 消费者:负责处理数据的模块(可能是方法,对象,线程,进程);
  3. 缓冲区:消费者不能直接使用生产者的数据,他们之间有个缓冲区

生产者将生产好的数据放到缓存区,消费者从缓存区拿出数据

解决方式 2

并发协作模型 ,"生产者/消费者模式"-->信号灯法

通过boolean标识来进行判断(红路灯)

总之:生产者生产 消费者消费,两条线程之间k可以进行通信,

目录
相关文章
|
2月前
|
Java 开发者
多线程编程范式(一) 协作范式
多线程编程范式(一) 协作范式
|
3月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
44 1
|
8月前
|
存储 Java 调度
《Java-SE-第二十四章》之线程间协作
《Java-SE-第二十四章》之线程间协作
|
11月前
|
Go C++
通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)
通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)
为什么线程协作的 wait() 方法需要写在循环里,你有想过吗?
那么问题是为啥这里是 while 而不是 if 呢?这个问题我最开始也想了很久,按理来说已经在 synchronized 块里面了嘛,就不需要了。这个也是我前面一直是这么认为的,直到最近看了一个 Stackoverflow 上的问题才对这个问题有了比较深入的理解。 试想我们要试想一个有界的队列。那么常见的代码可以是这样:
|
Java API 调度
【自省】线程同步看腻了,尝尝 > 入门级的线程间协作?
【自省】线程同步看腻了,尝尝 > 入门级的线程间协作?
85 0
【自省】线程同步看腻了,尝尝 > 入门级的线程间协作?
|
Java 调度
69. 对并发熟悉吗?谈谈线程间的协作(wait/notify/sleep/yield/join)
69. 对并发熟悉吗?谈谈线程间的协作(wait/notify/sleep/yield/join)
46 1
69. 对并发熟悉吗?谈谈线程间的协作(wait/notify/sleep/yield/join)
|
Java
一文理解java线程间协作问题的工具类Exchanger
在很久之前我曾写过一篇一篇文章介绍线程间如何进行通信的问题,当时使用的是等待通知模型,这篇文章介绍一个java提供的用于两个线程间通信的工具类Exchanger。
159 0
一文理解java线程间协作问题的工具类Exchanger
|
消息中间件 负载均衡 算法
《重学Java高并发》线程之间如何协作(父子线程如何优雅交互)
《重学Java高并发》线程之间如何协作(父子线程如何优雅交互)
《重学Java高并发》线程之间如何协作(父子线程如何优雅交互)
|
存储 Java
《重学Java高并发》之“摸底考试”:你会使用多线程实现生产者-消费者协作模型吗? 原创
《重学Java高并发》之“摸底考试”:你会使用多线程实现生产者-消费者协作模型吗? 原创
《重学Java高并发》之“摸底考试”:你会使用多线程实现生产者-消费者协作模型吗? 原创