目录
阻塞队列
阻塞队列(BlockingQueue)相较于普通的队列,添加了2个附加的操作。
(1)在队列为空时,获取元素的线程会等待队列变为非空。
(2)当队列满时,存储元素的线程会等待队列可用。
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。
如果是非阻塞队列在实现生产者和消费者模型时,我们需要手动的添加同步策略以及线程之间的唤醒策略。所以,阻塞队列可以很好解决这一问题。
代码实现:
public class Test {
private int queueSize = 10;
private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(queueSize);
public static void main(String[] args) {
Test test = new Test();
Producer producer = test.new Producer();
Consumer consumer = test.new Consumer();
producer.start();
consumer.start();
}
class Consumer extends Thread{
@Override
public void run() {
consume();
}
private void consume() {
while(true){
try {
queue.take();
System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Producer extends Thread{
@Override
public void run() {
produce();
}
private void produce() {
while(true){
try {
queue.put(1);
System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
博客参考
http://ifeve.com/java-blocking-queue/
http://www.cnblogs.com/dolphin0520/p/3932906.html
本文详细介绍了阻塞队列的基本概念及其在生产者消费者模型中的应用。通过对比非阻塞队列,阐述了阻塞队列如何简化线程间的同步及唤醒策略。并提供了一个简单的Java实现示例。


被折叠的 条评论
为什么被折叠?



