生产者指生存数据的线程,消费者指使用数据的线程。生产者消费者模式是指生产者安全的将数据交给消费者。
- 解耦:生产者和消费者只依赖缓冲区,而不互相依赖
- 支持并发和异步
- 解决忙闲不均的场景
- 使设计变的简单,处理速度也变快
- 由于几个线程共用到一个队列,需要解决同步、互斥和死锁等线程问题。
- Socket 通信
- 在多核时代,多线程并发处理速度比单线程处理速度更快,所以我们可以使用多个线程来生产数据,同样可以使用多个消费线程来消费数据。 而更复杂的情况是,消费者消费的数据,有可能需要继续处理,于是消费者处理完数据之后,它又要作为生产者把数据放在新的队列里,交给其他消费者继续处理。
- 队列:先接收的先传递。也就是先进先出(FIFO)。特殊队列,环形队列。
- 栈:后接收的先传递。也就是后进先出(LIFO),生产者消费者模式一般不使用这种方式
- Swing 事件分发线程
- Mediator 模式: 具体的实现类必须通过仲裁者来调解、控制; Producer-Consumer 模式中的通道(缓存)角色也负责调解,通过对各个线程执行互斥处理进行调解
- 线程池模式客户角色将数据传递给工作角色,聚焦在共享数据处理的线程,降低线程启动时的资源消耗,多个生产者或消费者可以通过线程池模式创建; 生产者消费者模式聚焦在生产者将数据传递给消费者角色
- Command 模式: Data 角色部分有时候可以采用该模式实现
- Strategy 模式:确定 Data 角色传递顺序部分可以使用策略模式实现
- Consumer 角色有多个的时候,要注意 Consumer 角色的线程之间的相互影响