java选择器是异步或非阻塞体系结构
以下是异步和非阻塞I/O的最可能定义:java选择器是异步或非阻塞体系结构,java,asynchronous,io,nio,nonblocking,Java,Asynchronous,Io,Nio,Nonblocking,以下是异步和非阻塞I/O的最可能定义: 异步I/O:异步I/O应用程序中的应用程序立即返回,操作系统将通知它们何时可以处理字节 非阻塞I/O:此处,应用程序立即返回可用数据,并且应用程序应具有轮询机制,以确定何时有更多数据准备就绪 在了解了这些定义后,如果我们分析java通道,即SocketChannel,ServerSocketChannel,DatagramSocketChannel,我们可以发现这些通道可以通过configureBlocking(boolean block)方法用作阻塞或非
异步I/O:
异步I/O应用程序中的应用程序立即返回,操作系统将通知它们何时可以处理字节
非阻塞I/O:
此处,应用程序立即返回可用数据,并且应用程序应具有轮询机制,以确定何时有更多数据准备就绪
在了解了这些定义后,如果我们分析java通道,即SocketChannel
,ServerSocketChannel
,DatagramSocketChannel
,我们可以发现这些通道可以通过configureBlocking(boolean block)
方法用作阻塞或非阻塞模式。假设我们使用它们作为非阻塞模式。所以问题来了:
如果我将使用选择器
,即将通道注册到选择器
,无论它是异步i/O还是非阻塞i/O
我觉得这是java中的异步I/O,当且仅当底层操作系统通知java应用程序通道的准备就绪选择时。除此之外,它是非阻塞I/O,选择器
只是一种机制,可以帮助我们轮询我在定义中提到的上述通道。哪个是正确的?提前谢谢
编辑:
我已经回答了问题的一部分,即I/O的类型以及java如何促进这些功能
但仍然存在一个问题:java提供的所有这些功能是在java层模拟的,还是它使用底层操作系统来实现的?假设底层操作系统具备这些功能的所有支持。
请参考答案
如果我将使用选择器,即将通道注册到选择器,是异步i/O还是非阻塞i/O
通道正在进行非阻塞I/O。选择器本身正在进行多路I/O。Java中的异步I/O是通过Futures完成的,其他语言中的异步I/O是通过信号量或回调完成的
但有一个问题仍然存在:java提供的所有这些功能是在java层模拟的,还是使用底层操作系统来实现的?假设底层操作系统具有对这些功能的所有支持
操作系统做到了这一点。应用程序不能,Java可以作为操作系统的应用程序。我想通过做更多的家庭作业来回答我的问题。这篇文章还将有助于理解底层操作系统的I/O概念
- 这是阻塞I/O:
,FileInputStream
,甚至对套接字的读写都属于这一类FileOutputStream
- 这是非阻塞I/O:它由Java中的套接字通道使用,如
,ServerSocketchannel
,SocketChannel
DatagramChannel
- 这是多路I/O:在Java中,选择器使用它来处理多个通道,这些通道本质上应该是非阻塞的。因此,套接字通道可以注册到
,选择器
可以通过底层操作系统的I/O多路复用功能进行管理选择器
- 现在是异步I/O。异步I/O应用程序会立即返回,操作系统会让它们知道字节何时可用于处理。在java中,异步socketchannel,
,异步服务器socketchannel
促进了这一过程异步文件通道