Java NIO 非阻塞模式 vs node.js 异步操作

Posted

技术标签:

【中文标题】Java NIO 非阻塞模式 vs node.js 异步操作【英文标题】:Java NIO non-blocking mode vs node.js asynchronous operation 【发布时间】:2014-01-11 12:28:29 【问题描述】:

node.js 的代码细节我还没看完。

但是,通过对 Node.js 中线程的一些研究,我发现它只有一个线程来接受来自多个客户端的连接。

当与客户端连接时,它会触发连接事件并监听另一个客户端,并以异步方式完全工作,客户端请求的其余操作从线程池执行,结果通过回调发送回主线程(接受连接的线程)。

与 Java NIO 一样,ServerSocketChannel、SocketChannel 也可以设置为非阻塞模式,并且使用选择器单线程可以监控多个通道。因此,使用 NIO ServerSocketChannel、SocketChannel 也可以从单线程中异步管理多个客户端的连接

那么,NIO 的非阻塞模式和 node.js 单线程异步是否遵循单线程概念的相同模式?正如两者所说,它们在单线程上执行。

【问题讨论】:

假设异步和非阻塞是相似的模式是常见的误解。 Node.js 还具有非阻塞套接字操作。所以是的,两个框架都有非阻塞 IO,允许它们处理来自单个线程的多个连接。 【参考方案1】:

没有。非阻塞意味着操作不会阻塞,它们会告诉你它们做了什么。异步意味着他们的操作并行继续,并在他们完成时给你回电。它们是完全不同的编程范式。

【讨论】:

我写了这个问题***.com/questions/35660710/… 并想知道你是否认为我混淆了同样的事情。 @johhny 是的。【参考方案2】:

一般的异步,尤其是 NIO,不一定由单线程支持,它们可以由多线程支持以提高性能。但是,多线程需要额外的同步(不复杂,但准确)。由于 javascript 缺少同步工具,Node.js 必须使用单线程。 Java 异步框架可以使用多个线程。

附录

为什么 Node.js 在设计上是单线程的?来自Understanding Node.js:

“所以我不必担心代码访问相同的数据 结构?”

你明白了!这就是 JavaScript 的全部魅力 单线程/事件循环设计!

因此,单线程设计最可能的原因是为了取悦那些不熟悉同步概念的 javascript 程序员

【讨论】:

Node.js 使用单线程,所以它不需要同步原语,而不是相反 您说 node.js 是单线程的原因是 javascript 缺少同步实用程序。这不是真的——node.js 在设计上是单线程的,所以它不需要它们。如果需要,它们可以被实现,javascript 没有什么可以阻止它

以上是关于Java NIO 非阻塞模式 vs node.js 异步操作的主要内容,如果未能解决你的问题,请参考以下文章

Java网络编程——NIO的阻塞IO模式非阻塞IO模式IO多路复用模式的使用

Java网络编程——NIO的阻塞IO模式非阻塞IO模式IO多路复用模式的使用

Java网络编程——NIO的阻塞IO模式非阻塞IO模式IO多路复用模式的使用

Java网络编程——NIO的阻塞IO模式非阻塞IO模式IO多路复用模式的使用

EchoServer.java (非阻塞模式)

JavaNIO非阻塞模式