`
生亦何欢
  • 浏览: 10758 次
社区版块
存档分类
最新评论

BlockingQueue深入理解生产者消费者模式

阅读更多

http://www.cnblogs.com/samqiu/p/4279836.html

这个博客已经很仔细的介绍了BlockingQueue.
我现在修改几个方法来说明BlockingQueue几个方法的区别。

1。修改等待时间
消费者等待时间非常短,没有产品加到队列
String data = queue.poll(20, TimeUnit.MILLISECONDS);


打印出的消息:
引用
启动生产者线程!
正在生产数据...
启动消费者线程!
启动生产者线程!
正在生产数据...
启动生产者线程!
正在生产数据...
正从队列获取数据...
退出消费者线程!
将数据:data:1放入队列...
将数据:data:2放入队列...


生产者要过两秒才会加入产品,现在没有产品消费者则强制退出。所以大于10后面数据放入的时候全是失败。

2。修改Blockingqueue的容量(用ArrayBlockingQueue)。
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1); 


上面的例子可以看到,从2开始,所有放入数据都是失败。

3。把消费者中poll改为take。
String data = queue.take();


结果是所有的生产者结束后,消费者会继续等待queue(被阻塞),如果不用BlockingQueue就需要用wait和notify来实现继续等待,而不BlockoingQueue内部实现了这个阻塞的功能。


理解BlockingQueue对JAVA 线程池里面的Queue也会有非常大的帮助。刚刚看线程池的时候不理解BlockingQueue。如果深刻理解了BlockingQueue后,对线程池也就知道了它的管理队列的方法,线程池的几种初始函数就是BlockingQueue的几种不同Type。
有边界的线程池;ArrayBlockingQueue
无边界的线程池:LinkedBlockingQueue
Direct handoffs:SynchronousQueue

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics