1.阻塞队列原理:
队列规则:FIFO 先进先出
栈: Stack, FILO 先进后出
2.阻塞队列的几大实现类:
3.阻塞场景分析:
存------------取
1.当队列满的时候,添加元素就会被阻塞
2.当队列是空的,如果还要取就会被阻塞
4.阻塞队列、set、List集合的接口关系:
5.阻塞队列的四组api:
方法 | 第一组会抛出异常 | 返回一个布尔值,不会抛出异常 | 延时等待 | 一直等待 |
插入 | add() | offer(e) | offer(e,time) | put() |
取出 | remove() | poll() | poll(time) | take() |
检查 | element() | peek() | - | - |
6.双端队列作用
支持头和尾两部分的入队和出队,效率相比
接口为:BlockingDeque,与BlockingQueue并列都集成Queue接口
7.demo实例
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
//直接存取:add remove ,异常报错
test1();
//offer pull, 返回true或者false
test2();
//offer pull, time 超时返回true或者false
test3();
//put take,队列满或者队列空一直等待
test4();
}
private static void test4() throws InterruptedException {
BlockingQueue queue=new ArrayBlockingQueue(7);
for(int i=0;i<7;i++){
queue.put(String.valueOf(i));
}
System.out.println("检查====="+queue.peek());
for(int i=0;i<8;i++){
System.out.println("获取====="+queue.take());
}
}
private static void test3() throws InterruptedException {
BlockingQueue queue=new ArrayBlockingQueue(5);
for(int i=0;i<7;i++){
System.out.println(queue.offer(String.valueOf(i),3, TimeUnit.SECONDS));
}
System.out.println("检查====="+queue.peek());
for(int i=0;i<7;i++){
System.out.println(queue.poll(3,TimeUnit.SECONDS));
}
}
private static void test2() {
BlockingQueue queue=new ArrayBlockingQueue(5);
for(int i=0;i<7;i++){
System.out.println(queue.offer(String.valueOf(i)));
}
System.out.println("检查====="+queue.peek());
for(int i=0;i<7;i++){
System.out.println(queue.poll());
}
}
//直接塞入:超过报错
private static void test1() {
BlockingQueue queue=new ArrayBlockingQueue(5);
queue.add("1");
queue.add("2");
queue.add("3");
queue.add("4");
queue.add("5");
//获取元素
System.out.println(queue.element());
// queue.add("6"); //超过六个报错
queue.remove();
queue.remove();
queue.remove();
queue.remove();
queue.remove();
queue.remove();//超过六个报错
}
}
8.阻塞队列应用场景分析
1.线程池设计使用阻塞队列,实现多余线程在阻塞队列中等待机制
2.生产者-消费者模式使用阻塞队列,以代替wait和notify方式进行处理
9.思考题
put和take是否一定是一组的,能够用 offer和take组成一组?
答:不能,put和take两个分别处理了两个condition:notFull和notEmpty,两者的等待和唤醒是一起的,如果用offer代替put。则会导致
数组有值后,还是处于等待状态