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

标签 java multithreading node.js asynchronous nio

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

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

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

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

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

最佳答案

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

附录

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

"So I don't have to worry about code accessing the same data structures at the same time?"

You got it! That's the entire beauty of JavaScripts single-threaded/event loop design!

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

关于Java NIO 非阻塞模式 vs node.js 异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20740961/

相关文章:

java - appium 从弹出列表中选择了不正确的项目

java - 将方法声明为 `return this` 有什么好方法吗?

Python 解释器占用了我 130% 的 CPU。这怎么可能?

java - 为什么 NIO 选择器总是监听端口列表中的最后一个端口?

node.js - Promise.all 遭到未处理的拒绝

javascript - Windows 和 Linux 上的 npm 安装有区别吗

java - JdbcBatchItemWriter 是否不支持 List<Map> 输入项?

java - Kafka 消费者如何选择下一个要轮询的主题?

multithreading - Pthreads 和多核编译器

javascript - Sequelize 关联 : How to update parent model when creating child?