for (Iterator iterator = lbq.iterator(); iterator.hasNext(); ) {
String string = (String) iterator.next();
System.out.println(string);
}
/**
* SynchronousQueue:一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。
* 同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要移除元素时,该元素才存在;
* 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)插入元素;也不能迭代队列,因为其中没有元素可用于迭代。
* 队列的头 是尝试添加到队列中的首个已排队插入线程的元素;如果没有这样的已排队线程,则没有可用于移除的元素并且 poll() 将会返回 null。
* 对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空 collection。此队列不允许 null 元素。
*
* 同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,
* 在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。
* 对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。
* 但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。
*/
final SynchronousQueue<String> sq = new SynchronousQueue<String>();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(sq.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
sq.add("asdasd");
}
});
t2.start();
/**
* 一个基于已链接节点的、任选范围的阻塞双端队列。
* 可选的容量范围构造方法参数是一种防止过度膨胀的方式。如果未指定容量,那么容量将等于 Integer.MAX_VALUE。
* 只要插入元素不会使双端队列超出容量,每次插入后都将动态地创建链接节点。
* 大多数操作都以固定时间运行(不计阻塞消耗的时间)。
* 异常包括 remove、removeFirstOccurrence、removeLastOccurrence、contains、iterator.remove() 以及批量操作,它们均以线性时间运行。
*/
LinkedBlockingDeque<String> dq = new LinkedBlockingDeque<String>(10);
// 在不违反容量限制的情况下,将指定的元素插入此双端队列的末尾。
dq.add("1");
// 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的开头;如果当前没有空间可用,则抛出 IllegalStateException。
dq.addFirst("a");
// 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的末尾;如果当前没有空间可用,则抛出 IllegalStateException。
dq.addLast("b");
// 获取,但不移除此双端队列的第一个元素;如果此双端队列为空,则返回 null。
System.out.println("查看头元素:" + dq.peekFirst());
// 获取并移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null。
System.out.println("获取尾元素:" + dq.pollLast());
Object[] objs = dq.toArray();
for (int i = 0; i < objs.length; i++) {
System.out.println(objs[i]);
}