异步/同步操作的确切工作原理

How exactly do asynchronous/synchronous operations works

提问人:Ineversurrender93 提问时间:7/27/2021 更新时间:7/27/2021 访问量:46

问:

假设我们有一个方法:HarryIsLarry()

public void HarryIsLarry() { 
write("Hello");
System.out.println("Write operation complete");
}

现在让我们假设这个方法是网络框架的一部分,其中 write() 将向远程节点发送一个字符串。假设 write() 是一个同步 (IO) 操作。这是否意味着执行任务的线程将停止,这意味着在 write() 完成之前不会执行 System.out.println()?

接下来,让我们假设我们的方法是异步 (NIO) 框架的一部分,因此在这个新场景中,写入将是非阻塞的。这是否意味着即使 write() 尚未完成,System.out.println() 也会被执行?甚至可能是方法已返回但写入操作尚未完成?

Java IO NIO

评论

0赞 markspace 7/27/2021
金达。始终“完成”,因为该方法完成并返回到下一行。网络会发生什么取决于写入方法的规范。实际上,任何网络操作都会相对较慢,因此充其量是将数据包放在网络上的实际行为与 .在最坏的情况下,通过用数据填充缓冲区来完成,但不做任何其他事情,并且在某个或其他方法填充缓冲区之前不会有数据包。write()println()write()flush()
0赞 Ineversurrender93 7/28/2021
那么你说的是,在异步 write() 操作中,TCP 数据将通过“电缆”传输到它的端点目的地,如果在 println() 上,甚至在方法完全返回时,它甚至可能不会到达它的目的地?此外,如果是这种情况,同步 write() 操作是否会阻止当前线程(例如,println() 不会被打印,直到在其端点目标处收到消息)
0赞 markspace 7/28/2021
不,我是说同步和异步写入在运行时可能仍会沿着电缆传输。或者即使跑步,两者都可能无法到达目的地。我还说两者都可以缓存在缓冲区中,并且在被调用之前根本不发送。实现可以阻止同步写入,直到整个数据包在网络上,或者直到收到 ACK,但我认为这两种行为都不能保证。(实际上现在我自己有点好奇,我的默认值是“什么都不期望”,所以我是如何编写代码的。println()printlnflush()
0赞 Ineversurrender93 7/28/2021
“什么都不期待,”是的,我很确定这会有所帮助。 🤣

答: 暂无答案