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

[url]http://www.cnblogs.com/samqiu/p/4279836.html[/url]

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

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


打印出的消息:
[quote]启动生产者线程!
正在生产数据...
启动消费者线程!
启动生产者线程!
正在生产数据...
启动生产者线程!
正在生产数据...
正从队列获取数据...
[color=red]退出消费者线程![/color]
将数据:data:1放入队列...
将数据:data:2放入队列...[/quote]

生产者要过两秒才会加入产品,现在没有产品消费者则强制退出。所以大于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值