简单队列(非阻塞和阻塞队列)

目录

一、非阻塞式队列

二、阻塞队列

三、阻塞队列与线程池的关系


1、队列遵循先进先出的原则FIFO

2、阻塞队列最大的好处就是能防止队列容器溢出,防止数据丢失

3、非阻塞队列是无界的,使用offer来增加数据,poll来取出数据

一、非阻塞式队列

简单代码示例:

import java.util.concurrent.ConcurrentLinkedQueue;

public class QueueTestOrder {

    // 阻塞队列最大的好处就是嫩巩固防止队列容器溢出,防止丢失数据
    public static void main(String[] args) {
        ConcurrentLinkedQueue<Object> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
        concurrentLinkedQueue.offer("张三");
        concurrentLinkedQueue.offer("李四");
        concurrentLinkedQueue.offer("王五");

        // 获取队列,只能获得第一个元素(FIOF)
        System.out.println(concurrentLinkedQueue.poll());
        System.out.println(concurrentLinkedQueue.poll());
        System.out.println(concurrentLinkedQueue.poll());
        System.out.println(concurrentLinkedQueue.poll());

        // 获取队列个数
        System.out.println(concurrentLinkedQueue.size());
    }
}

执行结果:

二、阻塞队列

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class QueueBlock {

    // 如果存队列的时候,如果队列满了就会等待,如果取队列的时候,如果队列为空,也会等待
    public static void main(String[] args) throws InterruptedException {
        // 最多支持3个队列总数,阻塞式队列
        ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(3);
        blockingQueue.offer("张三");
        blockingQueue.offer("李四");
        blockingQueue.offer("王五");
        blockingQueue.offer("赵六", 3, TimeUnit.SECONDS);

        // 使用peek方法会从取出队列的第一个,但是不会移除
        System.out.println(blockingQueue.peek());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        // 这里还有数据,不会阻塞
        System.out.println(blockingQueue.poll(3, TimeUnit.SECONDS));
        // 只有到最后一个取不到数据时才会阻塞
        System.out.println(blockingQueue.poll(3, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll());
    }
}

执行结果:

 注意:

        1、队列中如果没有存满,存入数据后会返回true,否则会阻塞并返回false

        2、队列中如果数据还没有取完,不会等待,只有在最后一个数据被取完之后执行poll才阻塞

三、阻塞队列与线程池的关系

        线程池对应的阻塞队列

线程池阻塞队列
FixedThreadPoolLinkedBlockingQueue
SingleThreadExecutorLinkedBlockingQueue
CachedThreadPoolSynchronousQueue
ScheduledThreadPoolDelayedWorkQueue
SingleThreadScheduledExecutorDelayedWorkQueue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值