我在while循环中有一个嵌套分配,这给了我意外的结果。 下面的代码在将包数据写入文件的线程中运行。通过ConcurrentLinkedQueue从另一个线程接收软件包。
只要生产者将包放入队列中,此代码就永远不会进入写部分。
Packet packet = null;
while (!done || (packet = queue.poll()) != null){
if (packet != null){
packet.write(bufferedOutputStream);
}
else{
Thread.sleep(100);
}
}
但是,只要队列中有数据包,此代码就会进入写部分。对我来说这是预期的行为。
Packet packet = null;
while (!done || packet != null){
packet = queue.poll();
if (packet != null){
packet.write(bufferedOutputStream);
}
else{
Thread.sleep(100);
}
}
有什么我想念的吗?为什么这些代码段会产生不同的结果?
答案 0 :(得分:6)
while (!done || (packet = queue.poll()) != null){
...
||
短路。这意味着,如果第一个操作数为true,则不对第二个操作数求值。
对于此代码,这意味着如果done
为假,将不评估(packet = queue.poll()) != null
,因此不会重新分配packet
。