目录
阻塞队列
阻塞队列(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