使用队列遇到问题,总感觉它阻塞后不能成功解除,所以写了个demo,实时证明Queue是没有问题的,自己遇到的问题要从其它地方排查原因。
下面例子可以看到,调用queue.take()的时候会阻塞该线程,在另一个线程里给queue put进元素以后,queue.take()的阻塞会自动解除,执行queue.take()之后的代码。
public class TestQueue {
private static LinkedBlockingQueue<String> queue;
public static void init() {
queue = new LinkedBlockingQueue<String>(10);
}
static void putElement(String s) {
// new Thread(new Runnable() {
// @Override
// public void run() {
queue.offer(s);
System.out.println("offer:" + s);
// }
// }).start();
}
static String takeElement() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
System.out.println("尝试take:");
String take = queue.take();
System.out.println(take);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return null;
}
public static void main(String[] args) {
try {
init();
putElement("a");
putElement("b");
takeElement();
Thread.sleep(3000);
putElement("c");
putElement("d");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果
offer:a
offer:b
尝试take:
a
尝试take:
b
尝试take:
offer:c
c
尝试take:
d
尝试take:
offer:d
或者
offer:a
offer:b
尝试take:
a
尝试take:
b
尝试take:
offer:c
offer:d
c
尝试take:
d
尝试take:
打印顺序不同是因为线程原因。能够测试想要的结果。