1 什么是生产者消费者模式
引用:https://www.jianshu.com/p/f53fb95b5820
生产者和消费者模式是线程模型中的经典问题:生产者就是生产数据的线程,消费者就是消费数据的线程。生产者和消费者在同一时刻共享的有界缓冲区,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。为了使这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止,有很多方法......
实现生产者消费者模型的方法(缓冲区的具体方法):
(1)synchronized + wait() / notify()方法
(2)ReentrantLock + await() / signal()方法 (线程锁)
(3)BlockingQueue阻塞队列方法
引用:https://blog.csdn.net/fct2001140269/article/details/82940899
1 wait() 当缓冲区已满时生产者线程等待(这个线程停止),为空时消费者线程等待 ,放弃锁,让其他线程执行。
notify() 生产者/消费者向缓冲区放入/取出一个产品时,放弃锁,(实时)通知其他线程执行。
2 引入ReentrantLock后代替同步锁,配合await() / signal()代替wait() / notify(),控制多线程更优
Java中的ReentrantLock和synchronized两种锁定机制的对比
引用 https://blog.csdn.net/fw0124/article/details/6672522
3 BlockingQueue阻塞队列
已在内部实现了ReentrantLock同步。它可以在生成对象时指定容量大小。它用于阻塞操作的是put()和take()方法:
put()方法:在生产者线程,容量达到最大时,自动阻塞。
take()方法:在消费者线程,容量为0时,自动阻塞。