Skip to content

Latest commit

 

History

History
27 lines (27 loc) · 2 KB

producer-consumer.md

File metadata and controls

27 lines (27 loc) · 2 KB

Producer-Consumer 模式(生产者-消费者模式)

生产者指生存数据的线程,消费者指使用数据的线程。生产者消费者模式是指生产者安全的将数据交给消费者。

优点

  • 解耦:生产者和消费者只依赖缓冲区,而不互相依赖
  • 支持并发和异步
  • 解决忙闲不均的场景
  • 使设计变的简单,处理速度也变快

缺点

  • 由于几个线程共用到一个队列,需要解决同步、互斥和死锁等线程问题。

使用场景

  • Socket 通信
  • 在多核时代,多线程并发处理速度比单线程处理速度更快,所以我们可以使用多个线程来生产数据,同样可以使用多个消费线程来消费数据。 而更复杂的情况是,消费者消费的数据,有可能需要继续处理,于是消费者处理完数据之后,它又要作为生产者把数据放在新的队列里,交给其他消费者继续处理。

Data的顺序传递

  • 队列:先接收的先传递。也就是先进先出(FIFO)。特殊队列,环形队列。
  • 栈:后接收的先传递。也就是后进先出(LIFO),生产者消费者模式一般不使用这种方式

JDK 实例

  • Swing 事件分发线程

相关设计模式

  • Mediator 模式: 具体的实现类必须通过仲裁者来调解、控制; Producer-Consumer 模式中的通道(缓存)角色也负责调解,通过对各个线程执行互斥处理进行调解
  • 线程池模式客户角色将数据传递给工作角色,聚焦在共享数据处理的线程,降低线程启动时的资源消耗,多个生产者或消费者可以通过线程池模式创建; 生产者消费者模式聚焦在生产者将数据传递给消费者角色
  • Command 模式: Data 角色部分有时候可以采用该模式实现
  • Strategy 模式:确定 Data 角色传递顺序部分可以使用策略模式实现

注意事项

  • Consumer 角色有多个的时候,要注意 Consumer 角色的线程之间的相互影响