我在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)
有什么我错过了吗?为什么这些代码片段会产生不同的结果?
while (!done || (packet = queue.poll()) != null){
...
Run Code Online (Sandbox Code Playgroud)
||是短路的.这意味着如果第一个操作数为true,则不计算第二个操作数.
对于此代码,这意味着如果done为false,(packet = queue.poll()) != null则不会进行评估,因此packet不会重新分配.
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |