Java NIO非阻塞模式与Node.js异步操作的比较

19

我没有深入了解过 node.js 的代码细节。

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

当与客户端连接后,它会触发连接事件并监听其他客户端,并完全采用异步方式工作,则客户端请求的其余操作是从线程池中执行的,并通过回调函数将结果发送回接受连接的主线程(即单个线程)。

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

那么,NIO的非阻塞模式和node.js的单个异步线程是否遵循相同的单线程概念模式?因为两者都表示它们在单个线程上执行。


1
认为异步和非阻塞是相似模式是一个常见的误解。Node.js也具有非阻塞套接字操作。因此,两个框架都具有非阻塞IO,使它们能够从单个线程处理多个连接。 - user568109
2个回答

5
异步编程一般使用 NIO,不一定由单线程支持,也可以通过多线程来提高性能。然而,多线程需要额外的同步(不复杂,但要精确)。由于 javascript 缺乏同步工具,Node.js 必须使用单线程。Java 异步框架可以使用多个线程。
附录
为什么 Node.js 是单线程设计?参考自 了解 Node.js

"因此我不必担心代码同时访问相同的数据结构?"

没错!这就是 JavaScript 单线程 / 事件循环设计的全部之美!

所以单线程设计最可能的原因是为了迎合 javascript 程序员,毕竟大部分程序员并不熟悉同步概念。

2
Node.js使用单线程,因此它不需要同步原语,而不是相反。 - vkurchatkin
1
你说node.js之所以是单线程的原因是因为JavaScript缺乏同步工具。这并不正确——node.js是经过设计为单线程的,所以它不需要这些工具。如果需要的话,它们可以被实现,JavaScript本身没有任何阻止这样做的特性。 - vkurchatkin

3

不阻塞指操作不会被阻止,它们会告诉您它们做了什么。异步意味着操作在并行中继续进行,并在完成时回调您。它们是完全不同的编程模式。


我写了这个问题https://dev59.com/CJTfa4cB1Zd3GeqPR4Q4,想知道您是否认为我混淆了同样的事情。 - johnny
@johhny 是的,你是。 - user207421

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