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。则会导致

数组有值后,还是处于等待状态

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值