最近看见以前的一段代码,就粘了出来。这就是一个简单的阻塞队列,它继承了JDK原有的LinkedBlockingQueue,它也是线程安全的。与LinkedBlockingQueue不同的地方在于,UniqueLinkedBlockingQueue队列里面不允许出现重复性元素。该队列可以在很多场景中适用,比如:
多生产者的情形下,一起向队列中存放任务,这些任务不允许在队列里面出现重复,就可以使用这个队列。
代码如下:
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.locks.ReentrantLock; /** * <pre> * UniqueLinkedBlockingQueue.java * @author kanpiaoxue<br> * @version 1.0 * Create Time 2014年8月7日 下午1:32:31<br> * Description : 元素唯一的LinkedBlockingQueue阻塞队列 * </pre> */ public class UniqueLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> { private static final long serialVersionUID = 6523405086129214113L; private final ReentrantLock putLock = new ReentrantLock(); public void put(E e) throws InterruptedException { putLock.lock(); try { if (!contains(e)) { super.put(e); } } finally { putLock.unlock(); } } }
相关推荐
同时,作为阻塞队列,当生产者尝试向满队列添加元素时,或者消费者尝试从空队列中获取元素时,线程会被阻塞,直到队列有可用空间或数据,这大大简化了多线程同步的问题。 在生产者/消费者模式中,生产者通常通过`...
在Java中,`java.util.concurrent`包提供了多种阻塞队列实现,如`ArrayBlockingQueue`, `LinkedBlockingQueue`等。它们都实现了`BlockingQueue`接口,提供了一套线程安全的方法来添加和移除元素,如`put()`, `take()...
### 并发队列 ConcurrentLinkedQueue 和阻塞队列 LinkedBlockingQueue 用法详解 #### 一、并发队列 ConcurrentLinkedQueue 概述 `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能...
Java中的ArrayBlockingQueue和LinkedBlockingQueue都是典型的阻塞队列实现。 阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者...
LinkedBlockingQueue是基于链表结构实现的阻塞队列,其内部节点为Node类,包含元素值和指向下一个节点的引用。与ArrayBlockingQueue不同,LinkedBlockingQueue的容量可以是Integer.MAX_VALUE(即无界队列),也可以...
2. LinkedBlockingQueue:使用链表作为底层数据结构的阻塞队列。 3. SynchronousQueue:一个不存储元素的阻塞队列,生产者和消费者需要同时存在。 4. PriorityBlockingQueue:一个带有优先级的阻塞队列,元素的...
当队列已满,调用此方法的线程会被阻塞,直到有其他线程从队列中取出一个元素。 2. `take`方法:消费者用来从队列头部移除并返回元素。如果队列为空,调用此方法的线程会被阻塞,直至队列中有元素可用。 3. `offer`...
常见的阻塞队列实现包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。阻塞队列常被用作线程池的工作队列,连接生产者(添加任务的线程)和消费者(执行任务的线程),实现任务的异步处理。 ...
阻塞队列在队列满时会阻止生产者线程添加元素,在队列空时会阻止消费者线程取出元素,直到条件满足为止。本文将探讨两种实现简单阻塞队列的方法:使用`wait()`和`notify()`以及使用`CountDownLatch`。 1. 使用`wait...
阻塞队列的主要特点在于它支持两个额外的条件操作:当队列为空时,尝试从队列中取元素的操作会被阻塞,直到队列中出现新的元素;同样地,当队列已满时,尝试向队列中添加元素的操作也会被阻塞,直到队列中出现可用...
阻塞队列的核心特性在于其“阻塞”行为:当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程插入一个元素;当队列满时,尝试插入元素的线程会被阻塞,直到其他线程消费了一个元素。这种设计极大地简化了多线程...
2. **LinkedBlockingQueue**:基于链表结构实现的无界阻塞队列,也可通过构造函数指定容量大小变为有界队列。 3. **PriorityBlockingQueue**:支持按优先级排序的无界阻塞队列。 4. **DelayQueue**:基于优先级队列...
2. `take()`:获取并移除队首元素,如果队列为空,调用此方法的线程将被阻塞,直到队列中有元素。 3. `offer(E e, long timeout, TimeUnit unit)`:尝试插入元素,如果队列已满,可以等待指定时间,时间到仍无法...
* items数组:用于存储队列元素 * takeIndex和putIndex:分别表示队列的take和put索引 * count:表示队列中当前元素个数 * lock:ReentrantLock实例,用于保护队列操作 * notEmpty和notFull:Condition实例,用于...
在Java中,自Java 5.0起,`java.util.concurrent`包提供了多种阻塞队列的实现,例如`ArrayBlockingQueue`、`LinkedBlockingQueue`、`PriorityBlockingQueue`等。这些类都实现了`java.util.concurrent.BlockingQueue`...
在Java中,阻塞队列的实现类包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。它们都实现了BlockingQueue接口,提供了put()和take()方法,分别用于插入和移除元素,这两个方法在队列满或空时...
2. **队列实现**:接着可能会讲解几种具体的阻塞队列实现,比如`ArrayBlockingQueue`是基于数组的有界队列,`LinkedBlockingQueue`基于链表,以及`PriorityBlockingQueue`是无界的优先级队列,它们各自的特点和适用...
阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有元素可用;同样,当队列满时,尝试添加元素的线程也会被阻塞,直到队列有空间。这种机制避免了额外的同步和唤醒操作,简化了编程模型...
2. `LinkedBlockingQueue`: 基于链表结构的阻塞队列,容量可以无限大,但内部维护了一个容量参数来控制性能。 3. `PriorityBlockingQueue`: 一个无界的阻塞队列,其中元素按照优先级进行排序。 4. `DelayQueue`: 一...