Juc并发编程--阻塞队列分析
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。则会导致
数组有值后,还是处于等待状态