[url]http://www.cnblogs.com/samqiu/p/4279836.html[/url]
这个博客已经很仔细的介绍了BlockingQueue.
我现在修改几个方法来说明BlockingQueue几个方法的区别。
1。修改等待时间
消费者等待时间非常短,没有产品加到队列
打印出的消息:
[quote]启动生产者线程!
正在生产数据...
启动消费者线程!
启动生产者线程!
正在生产数据...
启动生产者线程!
正在生产数据...
正从队列获取数据...
[color=red]退出消费者线程![/color]
将数据:data:1放入队列...
将数据:data:2放入队列...[/quote]
生产者要过两秒才会加入产品,现在没有产品消费者则强制退出。所以大于10后面数据放入的时候全是失败。
2。修改Blockingqueue的容量(用ArrayBlockingQueue)。
上面的例子可以看到,从2开始,所有放入数据都是失败。
3。把消费者中poll改为take。
结果是所有的生产者结束后,消费者会继续等待queue(被阻塞),如果不用BlockingQueue就需要用wait和notify来实现继续等待,而不BlockoingQueue内部实现了这个阻塞的功能。
理解BlockingQueue对JAVA 线程池里面的Queue也会有非常大的帮助。刚刚看线程池的时候不理解BlockingQueue。如果深刻理解了BlockingQueue后,对线程池也就知道了它的管理队列的方法,线程池的几种初始函数就是BlockingQueue的几种不同Type。
有边界的线程池;ArrayBlockingQueue
无边界的线程池:LinkedBlockingQueue
Direct handoffs:SynchronousQueue
这个博客已经很仔细的介绍了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