Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们可以从JavaIO构建类似JavaNIO的东西吗?_Java_Io_Network Programming_Netty_Nio - Fatal编程技术网

我们可以从JavaIO构建类似JavaNIO的东西吗?

我们可以从JavaIO构建类似JavaNIO的东西吗?,java,io,network-programming,netty,nio,Java,Io,Network Programming,Netty,Nio,我看到JavaNIO相当复杂。我们能否从JavaIO中创建一些东西来达到JavaNIO的目的 我认为很容易实现面向缓冲区和非阻塞IO—Java NIO的两个主要特性。我们可以将数据从流中读入缓冲区,而不是立即处理它们。关于非阻塞IO,我们可以使用Java IO的setSoTimeout方法来允许线程在一段时间(例如100ms)后放弃等待。基于此,我们可以创建一个处理多个连接的线程 如果像上面那样简单,那么Java NIO是多余的吗?乍一看,您提出的解决方案可能会奏效。然而,这只是一个模拟,永远不

我看到JavaNIO相当复杂。我们能否从JavaIO中创建一些东西来达到JavaNIO的目的

我认为很容易实现面向缓冲区和非阻塞IO—Java NIO的两个主要特性。我们可以将数据从流中读入缓冲区,而不是立即处理它们。关于非阻塞IO,我们可以使用Java IO的setSoTimeout方法来允许线程在一段时间(例如100ms)后放弃等待。基于此,我们可以创建一个处理多个连接的线程


如果像上面那样简单,那么Java NIO是多余的吗?

乍一看,您提出的解决方案可能会奏效。然而,这只是一个模拟,永远不会像实际的NIO实现那样高效

原因是NIO的工作原理与JavaIO有本质的不同。这个“高级”部分需要操作系统的支持。当您只处理少量数据时,10ms与60ms看起来没有多大区别。但正如其他人所说,一个只需10秒而不是1分钟的I/O将带来巨大的不同


还有其他一些微妙之处。套接字超时与等待数据不同。异步I/O不必使用许多线程。通常,每个硬件设备一个线程就足够了。不需要等待。上下文切换更少。尽可能高效地处理数据,这包括不将数据从一个缓冲区复制到另一个缓冲区(如果可以避免的话)。最后,所有这些加起来。

不。100mS和零,甚至1mS和零之间有很大的区别。您无法通过读取超时有效地实现
select()
。好吧,我放弃,什么是“sth”?我想知道Java NIO如何识别通道中的数据是否可用?它不是在等待数据一段时间吗?@PeterPhan No。它调用
select(2)
poll()
变体之一。“我认为它很简单”:每个人想到简单解决他们不完全理解的问题的著名的第一句话。你能解释更多关于操作系统支持的信息吗?它们是什么?@PeterPhan使用普通IO时,每个通道需要1个线程,以确保延迟最小。使用NIO,您可以向操作系统提供一个套接字列表,然后它等待任何通道有数据(请参阅
select(2)
)的手册页),然后您可以快速查询每个通道有多少数据,并且只对有数据的通道再次执行操作哦“select(2)”。它是java方法吗?我搜索了谷歌,但没有发现任何关联。总体思路是将I/O设备视为自主设备。例如,您给磁盘一个命令,将一系列扇区直接读取到内存中,然后不处理它。完成后,磁盘将设置一个中断标志,以便CPU知道它需要维修。这是通过使用选择器(检查状态的机制)、缓冲区(物理内存区域的包装器)和通道(能够读取/写入数据的设备的抽象)实现的。在幕后,它使用诸如中断和DMA等硬件功能。操作系统提供硬件抽象,而JavaNIO提供操作系统抽象。