BlockingQueue接口 in Java was first introduced in Java 1.5. BlockingQueue接口 supports flow control by introducing blocking if either BlockingQueue is full or empty. All methods of BlockingQueue are atomic in nature and use internal locks or other forms of concurrency control.
BlockingQueue的实现是线程安全的,即,尝试将一个元素放入完整队列中的线程被阻塞,直到某个其他线程在队列中腾出空间为止,方法是使一个或多个元素出队或完全清除队列。 同样,它阻止尝试从空队列中删除的线程,直到其他一些线程插入一个项目为止。
BlockingQueue不接受空值。
BlockingQueue接口是Java集合框架的一部分“ java.util.concurrent”包以及其他各种并发的Utility类,例如ConcurrentHashMap,Counting Semaphore,CopyOnWriteArrrayList等。
Java提供了几种BlockingQueue实现,例如:
- LinkedBlockingQueueArrayBlockingQueuePriorityBlockingQueue同步队列
现在,让我们看一下这些指定的BlockingQueue实现中的每一个,并附带示例以清楚地了解。
LinkedBlockingQueue
的LinkedBlockingQueue将元素内部保持在链接结构(链接的节点)中,并使用FIFO(先进先出)订购。 如果需要,此链接结构可以选择具有上限。 如果未指定上限,整数MAX_VALUE用作上限。
这是实例化和使用LinkedBlockingQueue:
的BlockingQueue示例以下示例中的类正在启动制片人还有一个消费者 in separate threads. 的制片人 inserts strings into the BlockingQueue, and the 消费者 takes them out.
public class BlockingQueueExample {
public static void main(String[] args) throws Exception {
BlockingQueue<String> unbounded = new LinkedBlockingQueue<String>();
BlockingQueue<String> bounded = new LinkedBlockingQueue<String>(1024);
new Thread(new Producer(bounded)).start();
new Thread(new Consumer(bounded)).start();
Thread.sleep(4000);
}
}
制片人在其中插入字符串的类阻塞队列。
public class Producer implements Runnable {
protected BlockingQueue queue = null;
public Producer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
queue.put("Item #1");
Thread.sleep(1000);
queue.put("Item #2");
Thread.sleep(1000);
queue.put("Item #3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
消费者消耗插入到阻塞队列通过制片人类。
public class Consumer implements Runnable {
protected BlockingQueue queue = null;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ArrayBlockingQueue
ArrayBlockingQueue是类似于LinkedBlockingQueue的有界阻塞队列,它将内部元素存储在数组中FIFO(先进先出)订购。 此BlockingQueue的上限是在实例化时设置的,实例化后就无法更改。
这是实例化和使用ArrayBlockingQueue:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("ArrayBlockingQueue item: #1");
System.out.println(queue.take());
PriorityBlockingQueue
不像LinkedBlockingQueue和ArrayBlockingQueue,PriorityBlockingQueue是一个无限制的并发队列。 它遵循与java.util.PriorityQueue class和we cannot insert 空值进入这个队列。
的java.lang.Comparable接口必须由插入到PriorityBlockingQueue. 的elements thus order themselves according to whatever priority we decide in our Comparable implementation.
请注意PriorityBlockingQueue对具有相同优先级(compare()== 0)的元素不强制执行任何特定行为。 同样,如果我们从PriorityBlockingQueue获得迭代器,则迭代器也不保证按优先级顺序迭代元素。
这是实例化和使用PriorityBlockingQueue:
BlockingQueue queue = new PriorityBlockingQueue();
//String class implements java.lang.Comparable
queue.put("PriorityBlockingQueue item: #1");
System.out.println(queue.take());
SynchronousQueue
的同步队列是一个队列,内部只能包含一个元素,并且仅支持两个操作:放()和采取()。
这两个操作都处于阻塞状态,即,如果线程试图将元素插入队列中,它将被阻塞,直到另一个线程从队列中取出该元素为止。 同样,如果线程尝试获取一个元素并且当前不存在任何元素,则该线程将被阻塞,直到线程将一个元素插入队列。
虽然同步队列具有队列的接口,我们应该将其视为两个线程之间单个元素的交换点。
The post Understanding BlockingQueue In Java appeared first on Developers Journal.
288

被折叠的 条评论
为什么被折叠?



