嵌套的while循环分配在Java中产生了意外的结果

时间:2018-11-07 09:46:06

标签: java loops

我在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);
    }
}

有什么我想念的吗?为什么这些代码段会产生不同的结果?

1 个答案:

答案 0 :(得分:6)

while (!done || (packet = queue.poll()) != null){
    ...

||短路。这意味着,如果第一个操作数为true,则不对第二个操作数求值。

对于此代码,这意味着如果done为假,将不评估(packet = queue.poll()) != null,因此不会重新分配packet