小白日更第六十八天->BlockingQueue(阻塞队列)的四组API

15 篇文章 0 订阅

第一组

add()方法添加数据

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        for (int i = 0; i <6 ; i++) {
            blockingQueue.add(i);
        }
    }
}

运行结果:
在这里插入图片描述
可以看到这个add方法,在我们添加的时候,如果队列已经满了,就会抛出队列已满异常。

remove()方法弹出数据

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        blockingQueue.add(1);
        blockingQueue.add(1);
        blockingQueue.add(1);
        blockingQueue.add(1);
        blockingQueue.add(1);
        for (int i = 0; i <6 ; i++) {
            blockingQueue.remove();
        }
    }
}

运行结果:
在这里插入图片描述

这个remove方法和add配套使用,弹出队列的元素,当队列里面没有元素了也会抛出异常

第二种

offer()方法添加数据

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
    }
}

运行结果:
在这里插入图片描述

可以看到,这种往队列添加数据的offer方法,当队列满了的时候也不会抛出异常。

poll()方法弹出数据

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(1));
        for (int i = 0; i <6 ; i++) {
            System.out.println(blockingQueue.poll());
        }
    }
}

运行结果:
在这里插入图片描述
当队列没有数据的时候会返回一个null

第三种

put()方法添加数据

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
    }
}

运行结果:
在这里插入图片描述

就是正常的添加数据,现在我们再往队列种添加一个数据,然后查看一下结果:
在这里插入图片描述
程序不会结束,会一直等,也就是说这种添加数据的方法,当队列满的时候,会一直死等。

take()方法弹出数据

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        for (int i = 0; i <5 ; i++) {
            System.out.println(blockingQueue.take());
        }
    }
}

结果:
在这里插入图片描述
现在我们增加一次循环的次数看一下结果是不是也会一直等待:

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestDemo5 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        blockingQueue.put(1);
        for (int i = 0; i <6 ; i++) {
            System.out.println(blockingQueue.take());
        }
    }
}

结果:
在这里插入图片描述
和我们预期的一样,当队列没有数据的时候,会一直等到有数据,然后再输出数据。

第四种

offer()方法超时等待

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

public class TestDemo5 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,3, TimeUnit.SECONDS);
    }
}

运行结果:
在这里插入图片描述
当队列满的时候,程序会先等待3秒钟,然后程序停止。这种方式避免了一直等待,占用cpu资源。

poll()方法

package com.qcby.algorithm;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

public class TestDemo5 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(5);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
       blockingQueue.offer(1,2, TimeUnit.SECONDS);
        for (int i = 0; i <6 ; i++) {
            System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        }

    }
}

运行结果:
在这里插入图片描述
最后一个null不是一下就输出的,而是在输出队列数据的时候,发现没有数据了,然后等了两秒还没有数据,然后输出null。

以上就是我对阻塞队列四种API的简单了解。希望小伙伴们自己手动练习一下,加深印象。
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值