生产者消费者模型设计
- 生产者需要安全地将数据交给消费者
- 当生产者和消费者在不同的线程运行时,两者的处理速度差异会有问题。生产者消费者模型用于消除线程间处理速度的差异带来的问题
- 在该模式中,生产者和消费者会有多个,当生产者和消费者只有一个时,成为Pipe(管道)模式
- 线程协调和互斥问题(保护哪些数据),线程的协调需要考虑“放在中间的东西”,线程的互斥需要考虑保护哪些东西,为了让线程协调进行,必须进行互斥处理,以防止更多的内容被破坏,线程的互斥处理时为了线程的协调运行而执行的
为什么要有Channel? - Consumer想要获取Data,通常是因为想要使用Data来执行某些处理,如果Producer直接调用Consumer的方法,执行处理的就不是Consumer的线程,而是Producer的线程了。这样,异步处理就变成了同步处理,效率就会降低
- 同时承担安全守护责任,执行线程间的互斥处理,确保Producer产生的Data能够传递给Consumer
Channel的选择
- 队列–先生产先消费
- synchronzied、wait和notifyAll的使用
- ReentrantLock和Condition组合
- 使用BlockingQueue
- 栈–先生产后消费
- 优先队列