Java中阻塞式套接字写入和非阻塞式套接字写入有何区别?

3
非阻塞读取和阻塞读取的区别很明显,但写入方面我有些困惑。我知道非阻塞写入永远不会阻塞(当然!)。如果底层套接字缓冲区已满,则简单地不写入任何字节。这就是调用 channel.write 时检查已写入多少字节的重要性所在。
那么阻塞写入呢?什么时候会阻塞?调用 flush 时会阻塞吗?在 OutputStream 上调用 write 时呢?它是在等待底层写入套接字缓冲区中有空间吗?或者如果无法写入是否会抛出异常?

https://dev59.com/c13Ua4cB1Zd3GeqP9h0M - yadab
还有异步写入... - irreputable
@irreputable 异步写入是非阻塞写入,我认为。 - chrisapotek
不是很准确。这三种模式彼此非常不同。 - irreputable
@irreputable 异步写和非阻塞写有什么区别?异步写是否会给你一个回调函数?我在Java中从未见过这种情况。你有带有示例的链接吗? - chrisapotek
请查看Java 7中的AsynchronousXxx类。 - irreputable
1个回答

2

是的,它会阻塞直到底层操作系统套接字发送缓冲区中有足够的空间来复制您的字节。这可能会在您将数据放入与套接字关联的Java OutputStream时发生,或者在调用flush()时发生,无论哪种情况都会调用实际的write(2)系统调用。


哎呀,那么就没有办法知道调用 flush() 是否会永远卡住了吗?这太糟糕了...问题在于没有办法使套接字写入非阻塞,同时保留读取的阻塞状态,对吧? - chrisapotek
不,它是一个单一的二进制开关。 - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接