首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NIO和NIO的Java非阻塞和异步IO。2 (JSR203) -反应器/Proactor实现

使用NIO和NIO的Java非阻塞和异步IO。2 (JSR203) -反应器/Proactor实现
EN

Stack Overflow用户
提问于 2011-04-03 18:52:05
回答 4查看 14.1K关注 0票数 26

因此,我正在阅读我最喜欢的软件模式书籍之一(面向模式的软件体系结构-并发和网络对象的模式),特别是关于Proactor/Reactor异步IO模式的章节。我可以看到,通过使用可选择的通道,我可以很容易地实现反应器风格的异步IO机制(并且已经做到了)。但是,我不知道如何使用非阻塞写入来实现适当的Proactor机制。这就是利用操作系统管理的非阻塞写入功能。

特定于操作系统的调用支持的功能,如win32下的GetQueuedCompletionStatus

我确实看到Java7为NIO带来了一些带有异步完成处理程序的更新(这似乎是在正确的方向上)。话虽如此..。考虑到对操作系统管理的异步操作(特别是异步写入)缺乏统一的跨平台支持,我假设这是一个没有利用本机操作系统支持的quassy实现。

因此,我的问题是,在Java中,基于proactor的IO处理是否可以在特定场景中有利地使用;如果Java NIO支持基于proactor的IO处理(无论是在Java 6中还是在Java 7中),是否利用了操作系统管理的异步IO支持(即来自操作系统的完成回调)?此外,如果该实现纯粹是在虚拟机中实现的,则性能优势如此之小,以至于使用主动式事件处理只提供了一种构造并发网络处理软件的不同(可能更简单)的方法。

对于任何对主动事件处理感兴趣的人,here is a good article概述了优缺点,并与传统的每连接线程和反应式IO模型进行了比较。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-05 20:33:21

这其中涉及到很多因素。我将尝试尽可能好地总结我的发现(意识到关于reactor和proactor IO处理实现的有用性存在争议)。

是基于proactor的IO处理,在Java语言中是可能的,在特定的场景中使用它是很有优势的。

Java1.4引入了非阻塞IO,它与异步IO不同。JavaSE7引入了带有JSR203的异步IO,使得“真正的”proactor风格的IO处理实现成为可能。

请参阅AsyncrhonousSocketChannelAsynchronousServerSocketChannel

和,如果Java NIO支持基于proactor的IO处理(在Java6或Java7中),是否利用了操作系统管理的异步IO支持(即来自操作系统的完成回调)?

通读JSR203规范,使用新的异步通道的完成处理程序肯定是受支持的,据报道,本机操作系统功能正在被利用,但我还没有确定到什么程度。在对Java 7源代码进行分析之后,我可能会跟进这一点(除非有人抢先一步)。

此外,如果纯粹在虚拟机中实施,性能优势非常小,因此使用主动事件处理只提供了一种构建并发网络处理软件的不同(可能更简单)的方法。

我还找不到任何关于Java 7中新的异步IO特性的性能比较,但我相信它们将在不久的将来出现。

一如既往,当提出不止一种解决问题的方法时,哪种方法更好的问题几乎总是用“取决于”来回答。主动事件处理(使用异步完成处理程序)包含在Java7中,不能随意存在。对于某些应用程序,使用这种IO处理是有意义的。过去,proactor具有良好适用性的一个常见示例是在HTTP服务器中,其中经常发出许多短请求。有关give this a read的更深层次的解释(提供它只是为了突出proactor的优势,因此请尽量忽略示例代码是C++的事实)。

显然,在许多情况下,反应器/proactor使用更传统的方法使原本非常简单的设计变得复杂,而在其他更复杂的系统中,它们提供了高度的简化和灵活性。

。。。

顺便说一句,我强烈推荐通过the following presentation about NIO阅读,它提供了NIO和“传统”方法之间的性能比较。不过,我还建议谨慎对待呈现的结果,因为基准测试中的NIO实现是基于Java 1.4之前的NBIO NIO库,而不是1.4中提供的NIO实现。

票数 23
EN

Stack Overflow用户

发布于 2011-04-03 23:41:48

我会检查您是否真的需要担心阻塞写入。

没有数据可读的读数据块。在大多数情况下,这是可能的。但是,当缓冲区已满时,写入会阻塞,这种情况很少发生,并且通常表示连接速度较慢或使用者失败。

如果您想要非阻塞IO,请对读取执行非阻塞IO,因此也对写入执行非阻塞IO。

注意:使用阻塞IO和NIO通常更简单,并且可以超越非阻塞NIO,除非你有数千个连接,否则你可能会发现增加的复杂性是不值得的。(可能不是最好的选择)

票数 9
EN

Stack Overflow用户

发布于 2011-04-05 17:00:12

是我最喜欢的软件模式书籍之一(面向模式的软件体系结构-并发和网络对象的模式)

恕我直言,这本书已经非常过时了,而且在任何时候都不太切合实际。它产生于20世纪90年代末的设计模式狂潮,当时人们一致试图将整个计算机科学归结为设计模式。

我目前的观点是,NIO已经是一个框架和设计模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5529137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档