我们常用的LinkedList就实现了Queue接口,具有了offer()、poll()等操作。但是,LinkedList是线程不安全的,只使用于单线程操作。如果要实现一个线程安全的队列,一般有两种方式:一是使用阻塞算法,给读写操作加锁;二是使用非阻塞算法,通过循环CAS的方式来实现。本篇文章的ConcurrentLinkedQueue就是并发大师Doug Lea设计的一...
28ArrayBlockingQueue<Integer> queue =newArrayBlockingQueue<>(10);// 创建一个容量为10的阻塞队列// 生产者线程newThread(() -> {for(inti =0; ; i++) {// 不断生产资源try{ queue.put(i);// 尝试将资源放入队列,若队列满则阻塞System.out.println("生产者放入了一个资源:"+ i); }catch(Inter...
poll方法对应上面remove方法,两者的区别就在于是否会在无元素情况下抛出异常,poll方法在无元素时不会抛出异常而是返回null,如下代码: private static void groupPoll() { BlockingQueue queue = new ArrayBlockingQueue(2); System.out.println(queue.offer("云栖简码")); //添加元素 System.out.println(queue.poll...
ArrayBlockingQueue的删除数据方法有poll,take,remove这3个方法,总结如下: poll方法对于队列为空的情况,返回null,否则返回队列头部元素。 remove方法取的元素是基于对象的下标值,删除成功返回true,否则返回false。 poll方法和remove方法不会阻塞线程。 take方法对于队列为空的情况,会阻塞并挂起当前线程,直到有数据加入到队...
当容量满时要让生产者线程阻塞等待,当队列里没消息时让消费者线程阻塞等待。 阻塞队列用来平衡消费者和生产者 二、自定义简单的阻塞队列 2.1 使用synchronized和wait notify实现阻塞队列 我们先使用synchronized和wait notify来实现一个简单的阻塞队列。 // 自定义阻塞队列@Slf4jpublicclassMyBolckQueue<T> {//使用Link...
1. ArrayBlockingQueue ArrayBlockingQueue是一个有界的阻塞队列,底层是由数组实现的,当队列满时,新元素将无法添加到队列中,直到队列中有空闲位置为止。当队列为空时,获取元素的操作将会阻塞,直到队列中有元素可用。2. LinkedBlockingQueue LinkedBlockingQueue是一个无界的阻塞队列,底层是由链表实现的,可以存储...
poll(long timeout, TimeUnit unit):如果队列不空,出队;如果队列已空且已经超时,返回null;如果队列已空且时间未超时,则进入等待,直到出现以下三种情况: 被唤醒 等待时间超时 当前线程被中断 (1) ArrayBlockingQueue 先进先出有界循环数组 线程安全 利用有限数组存放任务,不支持扩容,每次只允许一个线程获取或者添加 ...
2.java的阻塞队列 2.1 ArrayBlockingQueue 基于数组实现的一个有界的阻塞队列,在创建ArrayBlockingQueue对象时必须指定容器大小。并且可以指定公平性和非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。 为什么是有界的? 看下图不指定容量会报错,那么指定了容量就是有界的。
poll(time, unit):当队列为空时,线程被阻塞,如果超过指定时间,线程退出 检查元素: element():获取队头元素,如果元素为null,抛出NoSuchElementException peek():获取队头元素,如果队列为空返回null,否则返回目标元素 ArrayBlockingQueue 底层基于数组的有界阻塞队列,在构造此队列时必须指定容量; ...
无异常类型[offer、poll、peek] offer offer方法是向队列中添加元素, 同时反馈成功与失败,如果失败则返回false,当队列已满时继续添加则会失败,代码如下: private static void groupOffer() { BlockingQueue queue = new ArrayBlockingQueue(2); System.out.println(queue.offer("i-code.online")); ...