同步与异步操作运行机制详解:基于网络框架write方法代码场景问询
方法定义
我们定义方法HarryIsLarry()如下:
public void HarryIsLarry() { write("Hello"); System.out.println("Write operation complete"); }
假设该方法属于某网络框架的组成部分,其中write()的作用是将字符串发送至远端节点,针对两类场景的问题解答如下:
场景1:write()为同步IO操作
答案是是的。
同步IO的核心特性就是调用线程会在IO操作完成前全程阻塞,write()方法只有在数据写入成功(具体是写入内核socket缓冲区还是实际发送到远端取决于实现,但操作本身已执行完成)才会返回。所以必须等write()执行完毕后,才会运行后面的System.out.println()语句,此时打印的内容和实际写操作完成的时序是完全对应的。
场景2:所属为异步NIO框架,write()为非阻塞操作
你提到的两个推论都是正确的。
非阻塞write()的执行逻辑是仅把待发送的数据提交到框架缓冲区或者内核socket发送缓冲区就立刻返回,不会等待数据实际发送到远端节点,甚至不会等待内核完成数据拷贝。因此write()还没完成实际网络发送的时候,后续的System.out.println()就已经执行了,完全可能出现HarryIsLarry()方法已经返回,但底层的网络写操作还在进行的情况。
这种场景下打印的"Write operation complete"仅代表写请求提交完成,不代表实际网络发送完成,如果需要在实际写操作结束后执行后续逻辑,需要使用异步框架提供的回调、Future监听等能力来实现。
内容的提问来源于stack exchange,提问作者Ineversurrender93
相关产品推荐
相关产品推荐

