阻塞队列 Blocking Queue
当队列空时,获取元素的线程会等待
当队列满时,存储元素的线程会等待
主要有以下几种:
ArrayBlockingQueue :一个由数组结构组成的 有界 阻塞队列。
此队列按照先进先出(FIFO)的原则对元素进行排序。
LinkedBlockingQueue :一个由链表结构组成的 有界 阻塞队列。
此队列按照先进先出(FIFO)的原则对元素进行排序。
PriorityBlockingQueue :一个支持优先级排序的 无界 阻塞队列。
默认情况下元素采取自然顺序排列,也可以通过比较器 comparator 来指定元素的排序规则。元素按照升序排列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
操作方法
插入:
add(e):抛出异常
offer(e):返回特殊值
put(e):一直阻塞
offer(e,time,unit):超时退出
移除:
remove():抛出异常
poll():返回特殊值
take():一直阻塞
poll(time,unit):超时退出
生产者消费者是一道经典的题,现在我们用阻塞队列来实现它。
package com.zl;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by acer on 2017/5/7.
*/
public class ProducerConsumerTest {
public static void main(String[] args) {
BlockingQueue<Produce> p = new LinkedBlockingQueue<Produce>(10); //固定容器大小为10
Thread produce = new Thread(new Producer(p));
Thread consume = new Thread(new Consumer(p));
produce.start();
consume.start();
}
}
/**
* 生产者
*/
class Producer implements Runnable {
private BlockingQueue<Produce> p;
Producer(BlockingQueue<Produce> p) {
this.p = p;
}
@Override
public void run() {
int i = 0;
while (true) {
try {
//当生产的产品数量装满了容器,那么在while里面该产品容器(阻塞队列)会自动阻塞 wait状态 等待消费
p.put(new Produce("产品" + i));
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 消费者
*/
class Consumer implements Runnable {
private BlockingQueue<Produce> p;
Consumer(BlockingQueue<Produce> p) {
this.p = p;
}
@Override
public void run() {
try {
Thread.sleep(1000); //用于测试当生产者生产满10个产品后是否进入等待状态
while (true) {
//当容器里面的产品数量为空时,那么在while里面该产品容器(阻塞队列)会自动阻塞 wait状态 等待生产
Produce food = p.take();
System.out.println("消费" + food.getId());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 产品
*/
class Produce {
private String id;
public String getId() {
return id;
}
public Produce(String id) {
this.id = id;
System.out.println("生产" + id);
}
}