嵌套while循环赋值在Java中产生意外结果

And*_*eas 0 java loops

我在while循环中有一个嵌套赋值,这给了我意想不到的结果.下面的代码在一个将包数据写入文件的线程中运行.通过ConcurrentLinkedQueue从另一个线程接收包.

只要生产者将包放入队列中,此代码就永远不会进入写入部分.

Packet packet = null;
while (!done || (packet = queue.poll()) != null){
    if (packet != null){
        packet.write(bufferedOutputStream);
    }
    else{
        Thread.sleep(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,只要队列中有数据包,此代码就会进入写入部分.这对我来说是预期的行为.

Packet packet = null;
while (!done || packet != null){
    packet = queue.poll();
    if (packet != null){
        packet.write(bufferedOutputStream);
    }
    else{
        Thread.sleep(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么我错过了吗?为什么这些代码片段会产生不同的结果?

khe*_*ood 6

while (!done || (packet = queue.poll()) != null){
    ...
Run Code Online (Sandbox Code Playgroud)

||是短路的.这意味着如果第一个操作数为true,则不计算第二个操作数.

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