java-BlockingQueue 使用说明

来源:互联网 发布:java 文件md5校验 编辑:程序博客网 时间:2024/04/25 20:08
1、Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。

2、java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安全放入和提取实例的队列。

3、BlockingQueue 接口方法如下(来自API)

4、BlockingQueue 的实现
BlockingQueue 是个接口,你需要使用它的实现之一来使用 BlockingQueue。java.util.concurrent 具有以下 BlockingQueue 接口的实现(Java 6):
● ArrayBlockingQueue
● DelayQueue
● LinkedBlockingQueue
● PriorityBlockingQueue
● SynchronousQueue

1)数组阻塞队列 ArrayBlockingQueue
public class ArrayBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。
这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致放入操作受阻塞;试图从空队列中检索元素将导致类似阻塞。
使用示例:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("Hello World");
Object object = queue.take();
System.out.println(object);

2)延迟队列 DelayQueue
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E>
Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。
DelayQueue 将会在每个元素的 getDelay() 方法返回的值的时间段之后才释放掉该元素。如果返回的是 0 或者负值,延迟将被认为过期,该元素将会在 DelayQueue 的下一次 take  被调用的时候被释放掉。
使用示例:
public class DelayedElement implements Delayed {
@Override
public int compareTo(Delayed o) {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
return 0;
}
}

DelayQueue queue1 = new DelayQueue();
Delayed element1 = new DelayedElement();
queue.put(element1);
Delayed element2 = (Delayed) queue.take();
System.out.println(element2);

3)链阻塞队列 LinkedBlockingQueue
public class LinkedBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
LinkedBlockingQueue 内部以一个链式结构(链接节点)对其元素进行存储。此队列按 FIFO(先进先出)排序元素。
使用示例
BlockingQueue bounded = new LinkedBlockingQueue();
bounded.put("Hello World");
Object object1 = bounded.take();
System.out.println(object1);

4)具有优先级的阻塞队列 PriorityBlockingQueue
public class PriorityBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
一个无界的阻塞队列,它使用与类PriorityQueue 相同的顺序规则,并且提供了阻塞检索的操作。不允许使用 null 元素。所有插入到 PriorityBlockingQueue 的元素必须实现 java.lang.Comparable 接口。因此该队列中元素的排序就取决于你自己的 Comparable 实现。
注意 PriorityBlockingQueue 对于具有相等优先级(compare() == 0)的元素并不强制任何特定行为。
同时注意,如果你从一个 PriorityBlockingQueue 获得一个 Iterator 的话,该 Iterator 并不能保证它对元素的遍历是以优先级为序的。

5)同步队列 SynchronousQueue
public class SynchronousQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的 是尝试添加到队列中的首个已排队线程元素;如果没有已排队线程,则不添加元素并且头为 null。对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空集合。此队列不允许 null 元素。


0 0