用阻塞队列(BlockingQueue)解决“生产者-消费者”问题

问题引入

之前用Java的Object类自带的wait和notify解决了这个问题,详细的问题阐述见:https://blog.zzkun.com/archives/140

这两种实现方式都很重要,原理有些相通的地方。

BlockingQueue的原理

查看ArrayBlockingQueue类的源码可以发现,他就是用Java的可重入锁(ReentrantLock)来实现的。

下面是put()和take()方法的源代码:

ReentrantLock可以实现与“synchronized+wait+notiry”相同的功能,并且允许程序员自由控制加锁解锁过程,还能实现公平锁等功能。

BlockingQueue借此很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。

实现代码

可以看到,利用阻塞队列,可以更少的代码更简单得完成任务。

运行结果

发表评论

电子邮件地址不会被公开。