node.js的单线程异步是什么意思呢?(转)

首先必须明白,开发者所编写的JavaScript代码都是运行在JavaScript脚本引擎上的。Node.js采用的是V8引擎,这个引擎最初是被用在一些浏览器上,比如Chrome。

浏览器的主要结构就包括渲染引擎(也称浏览器内核,比如常听说的webkit、blink)和JavaScript脚本引擎。JavaScript引擎的一个重要作用就是为了操作DOM,如果采用多线程的结构的话很容易导致冲突,比如多段代码在操作同一个的DOM元素的时候会因为执行时间先后导致执行结果难以预测。所以采用了单线程的形式简化问题,同时还让渲染引擎和JavaScript引擎互斥的方式执行,也就是相互阻塞,渲染的页面的时候不执行脚本,执行脚本的时候不渲染页面。

但是JavaScript的功能不光是操作DOM啊,尤其是AJAX技术出现之后,JavaScript还有发送网络请求的作用,继续用单线程的方式会阻塞整个页面。但是又要支持这种异步的操作,怎么办呢?

JavaScript引擎于是采用回调的形式来处理异步问题。当进行可能产生阻塞的IO操作时(比如网络请求、文件读写),那么交给底层的线程来处理,同时JavaScript引擎内部维护一个执行队列,轮询底层线程的执行结果,当某个执行完成时,调用对应的回调函数返回结果。

再回到Node.js,JavaScript引擎作为Node.js的一部分,也将这种特性带入了Node.js。但是与浏览器环境不同的是,Node.js没有了渲染引擎,同时内部还有一些其他的C++库来处理IO操作。所以常说的单线程异步特性指的是JavaScript引擎的特性。下面是Node.js的运行简图

node.js的单线程异步是什么意思呢?(转)

Node.js和Java在线程最大的区别应该是。Node.js的子线程是底层控制的,对于开发者而言是不可见的(Node.js 10 以后的版本添加了实验性功能,支持多线程处理CPU密集型问题。),好处就是开发者不再需要关注线程的管理,只需要写好异步代码就行,而Java提供了多线程的API,需要开发者手动管理。
打个比方,就像C++对内存操作开放给了开发者,但是Java的内存由jvm管理。

转载于某技术大佬:https://www.zhihu.com/tardis/landing/360/ans/698894796?query=node%E5%86%99%E4%B8%80%E4%B8%AA%E5%BC%82%E6%AD%A5%E5%A4%9A%E7%BA%BF%E7%A8%8B&mid=4d488b46ecb5cdf648bb08d0bf7d97f9&guid=B3FE5C7198B99EB72FDEC6AF24120244.1564019462651