java链表并发队列LinkedBlockingQueue的坑链个队⽐数组队的性能要⾼, 所以⼀般⽤ LinkedBlockingQueue ⽐较多, 之前并没有注意各⽅法有什么不同.
环境: JDK 1.8中国留学生
今天发现在 LinkedBlockingQueue 有个坑:
⼊队⽅法 add不能随意使⽤ :
LinkedBlockingQueue< String > receiveQueue = new LinkedBlockingQueue< String >();
receiveQueue.add("123");
会导致在出队线程处理中 poll() ⽆法及时取得值:
纬编针织布
/**
* 独⽴处理队列线程
*/
private class receiveThread implements Runnable{
@Override
public void run() {
String msg = null;
while (receNext) {
try {
msg = receiveQueue.poll();
if(msg != null) {
//处理消息....
logger.info("接收数据:"+ msg );
} el {
奥巴马最后一次演讲Thread.sleep(2000);
}
cems
}catch (Exception e) {
<("接收线程异常", e);
} finally {
}
quarter}
}
}
struct经过查看原代码, add⽅法在此类中没有重写, ⼊队之后, 并没有触发操作, 因此是个坑.
洒洒重现的代码环境是:
1, add⽅法与poll所在的线程是在同⼀个类中, add在类⽅法中调⽤, poll 内部类线程中调⽤.
shifang2, poll的线程⼀直在运⾏, 当程序中其它代码(程序另⼀个线程中) 调⽤ add在⼀个⽅法后, poll并没有取得值.
新年好 英文经测试, 这时如果要poll要取得值必须 在poll之前调⽤ size() 才能让poll取得值. 否则 poll在测试的 10多秒后仍然得到空值.
3, 以上是在多线程环境时出现的, 如果在同⼀段代码中先 add再 poll这样测试, 是可以正常取得值的.
常用英语谚语经过测试与查看源代码, 在此类中 出队⽅法 receiveQueue.take(), ⼊队⽅法 receiveQueue.put(E o) 应配合使⽤.
由于时间限制其它⽅法没有再详细测试.