简述
在生产者 - 消费者模式中,通常有两类线程,一类是生产者线程一类是消费者线程。生产者线程负责提交用户请求,消费者线程则负责处理生产者提交的任务。
最简单粗暴的做法就是生产者每提交一个任务,消费者就立即处理,直到所有任务处理完。但是这样直接通信很容易出现性能上的问题,消费者必须等待它的生产者提交到任务才能执行,就不能达到真正的并行。同时生产者和消费者之间存在依赖关系,在设计上耦合度非常高,这是不可取的。那么最好的做法就是加一个中间层作为通信桥梁。
生产者和消费者之间通过共享内存缓存区进行通信。多个生产者线程将任务提交给共享内存缓存区,消费者线程并不直接与生产者线程通信,而在共享内存缓冲区获取任务,并行地处理。其中内存缓冲区的主要功能是数据再多线程间的共享,同时还可以通过该缓存区,缓解生产者和消费者间的性能差。它是生产者消费者模式的核心组件,既能作为通信的桥梁,又能避免两者直接通信,从而将生产者和消费者进行解耦。生产者不需要消费者的存在,消费者也不需要知道生产者的存在。
由于内存缓冲区的存在,允许生产者和消费者在执行速度上有差异,无论哪一方速度超过另一方,缓冲区都可以得到缓解,确保系统正常运行。
实现
使用 Disruptor 作为Queue
生产者 - 消费者模式 UML 图如下:
Disruptor 是第三方包,需要下载 jar 包导入项目或者使用 Maven 导入
Data 类
1 | package thread.producerConsumer.disruptor; |
数据生产工厂
1 | package thread.producerConsumer.disruptor; |
生产者 Producer
1 | package thread.producerConsumer.disruptor; |
消费者 Consumer
1 | package thread.producerConsumer.disruptor; |
Main 运行主类
1 | package thread.producerConsumer.disruptor; |